Сегодня, наконец-то, вышла финальная версия Scala 2.10.0, о чем на сообщают на официальном сайте.
Новые возможности:
Value классы
Теперь пользовательские классы могут наследоваться от AnyVal (раньше было возможно только от AnyRef). Позволяют добиться большей производительности, выделяя память для объектов во время компиляции.
class Wrapper(val underlying: Int) extends AnyVal
У класса должен быть единственный, публичный val параметр, тип которого будет типом вашего класса во время рантайма.
Есть некоторые ограничения, частично из-за текущей реализации JVM.
docs.scala-lang.org/overviews/core/value-classes.html
Неявные классы
Ключевое слово implicit теперь можно применять не только к методам, но и к классам. Добавлены для того, чтобы упростить расширение существующих классов и уменьшить нагрузку на implicit методы. Так же, очевидно, могут иметь только один параметр (можно больше, если остальные неявные). В классе можно определять только методы, исключение — параметр конструктора.
Синтаксис:
implicit class RichInt(n: Int) extends Ordered[Int] {
def min(m: Int): Int = if (n <= m) n else m
}
docs.scala-lang.org/sips/pending/implicit-classes.html
Интерполяция строк
val lang = "Scala"
println(s"Наконец-то в $lang появилась интерполяция!")
Чтобы компилятор интерполировал строку, перед ней нужно добавить специальный метод — интерполятор строки. Из коробки есть три интерполятора: s, f и raw.
S дозволяет вставлять в строку переменные (перед ними нужно поставить $) и выражения (заключите в ${}), f форматирует в стиле старого, доброго printf, а с raw, как можно догадаться из названия, вы можете использовать в строке упраляющие последовательности (escape sequences) — println(raw'somentext') напечатает одну строку.
Пока не работает с pattern matching, но обещают исправить к 2.11
val height = 1.9d
val name = "James"
println(f"$name%s is $height%2.2f meters tall") // James is 1.90 meters tall
docs.scala-lang.org/overviews/core/string-interpolation.html
Futures и Promises
Новые возможности для паралельного программирования. Идея в следующем — вы можете присвоить объекту значение, которого еще не существует. Например, результат функции, которая делает асинхронный запрос.
import scala.concurrent._
import ExecutionContext.Implicits.global
val session = socialNetwork.createSessionFor("user", credentials)
val f: Future[List[Friend]] = future {
session.getFriends()
}
docs.scala-lang.org/overviews/core/futures.html
Dynamic
Устраняет некоторые недостатки статической типизации.
Если вы вызвали метод, который не определен для данного класса и класс расширяет (extends) scala.Dynamic, тогда вызов метода заменяется на object.applyDynamic(«methodName») или, в зависимости от контекста, на applyDynamicNamed, selectDynamic или updateDynamic.
docs.scala-lang.org/sips/pending/type-dynamic.html
Зависимые типы методов
def identity(x: AnyRef): x.type = x // возвращаем то, что получили
Новый компилятор в байт-код, основанный на ASM
Поддерживает JDK 1.5, 1.6 и 1.7. По умолчанию генерирует байткод для 1.6. Использование генератора 1.5 не рекомендуется (deprecated).
Новый Pattern Matcher
Переписан с нуля, чтобы генерировать лучший код (больше никаких экспоненциальных взрывов). Теперь анализ и генерация кода независимы (первое можно отключить ключом -Xno-patmat-analysis).
Улучшеный Scaladoc
- Implicits (ключ -implicits)
- Диаграммы (ключ -diagrams, нужен graphviz)
- Группы (-groups)
Модуляризация функций
Чтобы использовать некоторые продвинутые и специализированные функции теперь нужно явно их импортировать.
docs.scala-lang.org/sips/pending/modularizing-language-features.html
Возможность конфигурировать thread pool для параллельных коллекций
Акторы Akka теперь в стандартной поставке
- Оригинальные акторы deprecated.
- Информация для миграции.
Улучшена производительность
- Более быстрый inliner
- `Range#sum теперь O(1)
- Обновление библиотеки ForkJoin
- Исправления в immutable TreeSet/TreeMap
- Улучшения для PartialFunctions
Добавлены ??? и NotImplementedError
Добавлены классы IsTraversableOnce и IsTraversableLike
Литералы для чисел с плавающей точкой и восьмеричных числе теперь deprecation
Удален scala.dbc
Экспериментальные возможности
Полный список изменений по сравнению с 2.9.2
Автор: shock_one