Scala 3.0: изучение новых интересных функций

Scala 3.0, также известная как Dotty, — это крупная версия, которая содержит несколько интересных новых функций и улучшений в языке программирования Scala. В этой статье мы рассмотрим некоторые заметные нововведения в Scala 3.0 и приведем примеры кода, демонстрирующие их использование.

  1. Типы объединения:
    В Scala 3.0 представлены типы объединения, которые позволяют определять тип как объединение двух или более типов. Это обеспечивает большую гибкость и выразительность определений типов. Вот пример:
def processInput(input: String | Int): Unit = {
  input match {
    case str: String => println(s"Received string input: $str")
    case num: Int => println(s"Received numeric input: $num")
  }
}
  1. Типы пересечений.
    Типы пересечений позволяют определить тип как пересечение двух или более типов, объединяя их возможности. Эта функция повышает выразительность системы типов Scala. Вот пример:
trait Printable {
  def print(): Unit
}
trait Loggable {
  def log(): Unit
}
def processObject(obj: Printable & Loggable): Unit = {
  obj.print()
  obj.log()
}
  1. Предложения Given/Using:
    Предложения Given/using обеспечивают более краткий синтаксис для неявной передачи параметров. Эта функция упрощает использование неявных значений и улучшает читаемость кода. Вот пример:
trait Logger {
  def log(message: String): Unit
}
given loggableLogger as Logger {
  def log(message: String): Unit = println(s"Logging: $message")
}
def processMessage(message: String)(using logger: Logger): Unit = {
  logger.log(message)
}
processMessage("Hello, World!")(using loggableLogger)
  1. Методы расширения.
    В Scala 3.0 представлены методы расширения, которые позволяют добавлять новые методы к существующим типам без изменения их исходных определений. Эта функция обеспечивает более естественный и интуитивно понятный синтаксис расширений методов. Вот пример:
extension (str: String) {
  def isPalindrome: Boolean = str == str.reverse
}
val text = "level"
println(text.isPalindrome) // Output: true
  1. Непрозрачные типы.
    Непрозрачные типы позволяют определять типы с ограниченным доступом, скрывая их базовое представление. Эта функция повышает безопасность типов и упрощает сопровождение кода. Вот пример:
opaque type Email = String
def sendEmail(to: Email, subject: String, body: String): Unit = {
  // Implementation details
}
val recipient: Email = "john@example.com"
sendEmail(recipient, "Greetings", "Hello, John!")

В Scala 3.0 представлено несколько интересных новых функций, повышающих выразительность, читаемость и типобезопасность языка. Типы-объединения, типы пересечений, предложения заданы/использования, методы расширения и непрозрачные типы — это лишь некоторые из заметных дополнений. Используя эти функции, разработчики могут писать более лаконичный, удобный в сопровождении и выразительный код Scala.