Сегодня, наконец-то, вышла финальная версия Scala 2.10.0, о чем на сообщают на официальном сайте.
Теперь пользовательские классы могут наследоваться от AnyVal (раньше было возможно только от AnyRef). Это дает возможность добиться большей производительности за счет отсутствия накладных расходов по сравнению с оборачиваемым классом.
У класса должен быть единственный, публичный val параметр, тип которого будет типом вашего класса во время исполнения.
Есть некоторые ограничения, частично из-за текущей реализации JVM.
docs.scala-lang.org/overviews/core/value-classes.html
Ключевое слово implicit теперь можно применять не только к методам, но и к классам. Добавлены для того, чтобы упростить расширение существующих классов и уменьшить нагрузку на implicit методы. Так же, очевидно, могут иметь только один параметр (можно больше, если остальные неявные). В классе можно определять только методы, исключение — параметр конструктора.
Синтаксис:
docs.scala-lang.org/sips/pending/implicit-classes.html
Чтобы компилятор интерполировал строку, перед ней нужно добавить специальный метод — интерполятор строки. Из коробки есть три интерполятора: s, f и raw.
S дозволяет вставлять в строку переменные (перед ними нужно поставить $) и выражения (заключите в ${}), f форматирует в стиле старого, доброго printf, а с raw, как можно догадаться из названия, вы можете использовать в строке управляющие последовательности (escape sequences) — println(raw«some\ntext») напечатает одну строку, а не две.
Пока не работает с pattern matching, но обещают исправить к 2.11
docs.scala-lang.org/overviews/core/string-interpolation.html
Новые возможности для параллельного программирования. Идея в следующем — вы можете присвоить объекту значение, которого еще не существует. Например, результат функции, которая делает асинхронный запрос.
docs.scala-lang.org/overviews/core/futures.html
Устраняет некоторые недостатки статической типизации.
Если вы вызвали метод, который не определен для данного класса и класс расширяет (extends) scala.Dynamic, тогда вызов метода заменяется на object.applyDynamic(«methodName») или, в зависимости от контекста, на applyDynamicNamed, selectDynamic или updateDynamic.
docs.scala-lang.org/sips/pending/type-dynamic.html
Поддерживает JDK 1.5, 1.6 и 1.7. По умолчанию генерирует байт-код для 1.6. Использование генератора 1.5 не рекомендуется (deprecated).
Переписан с нуля, чтобы генерировать лучший код (больше никаких экспоненциальных взрывов). Теперь анализ и генерация кода независимы (первое можно отключить ключом -Xno-patmat-analysis).
Чтобы использовать некоторые продвинутые и специализированные функции теперь нужно явно их импортировать.
docs.scala-lang.org/sips/pending/modularizing-language-features.html
Полный список изменений по сравнению с 2.9.2
Новые возможности:
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«some\ntext») напечатает одну строку, а не две.
Пока не работает с 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