Pull to refresh

Релиз Scala 2.10

Reading time 3 min
Views 7.9K
Сегодня, наконец-то, вышла финальная версия 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«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 теперь в стандартной поставке



Улучшена производительность


  • Более быстрый inliner
  • `Range#sum теперь O(1)
  • Обновление библиотеки ForkJoin
  • Исправления в immutable TreeSet/TreeMap
  • Улучшения для PartialFunctions

Добавлены ??? и NotImplementedError


Добавлены классы IsTraversableOnce и IsTraversableLike


Литералы для чисел с плавающей точкой и восьмеричных числе теперь deprecation


Удален scala.dbc



Экспериментальные возможности




Полный список изменений по сравнению с 2.9.2
Tags:
Hubs:
+19
Comments 11
Comments Comments 11

Articles