Релиз Scala 2.10

    Сегодня, наконец-то, вышла финальная версия 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
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 11

      +2
      Value-классы не выделяют память во время компиляции (вообще это как???), а позволяют делать бесплатные обертки вокруг других типов.

      Суть в том, что объект Value-класса не создается, если он никуда не возвращается и не передается. А все методы на нем переписываются компилятором как вызовы методов сопряженного объекта. Тем самым, если у нас есть код:

      class Meter(val value: Double) extends AnyVal {
      def plus(that: Meter): Meter = new Meter(value + that.value)
      }

      val x = new Meter(3.4)
      val y = new Meter(4.3)
      val z = x plus y

      println(z.value)

      То по сути будет что-то в духе:

      class Meter(val value: Double) extends AnyVal {
      def plus(that: Meter): Meter = Meter.extension$plus(this.value, that.value)
      }

      object Meter {
      def extension$plus($this: Double, that: Double) = new Meter($this + that)
      }

      val x = new Meter(3.4) // Если дальше не возвращается, то создания объекта тут нет
      val y = new Meter(4.3) // Если дальше не возвращается, то создания объекта тут нет
      val z = Meter.extension$plus(3.4, 4.3)

      println(z.value) // Насколько я понимаю, тут тоже нет объекта класса Meter

      upd. А тэг source тоже с отрицательной кармой не работает чтоль?
      upd2. Вот тут SIP: docs.google.com/document/d/10TQKgMiJTbVtkdRG53wsLYwWM2MkhtmdV25-NZvLLMA/edit?hl=en_US
          0
          Кроме оберток их еще используют в самой скале как rich примитивы.
          Я мало что понимаю в тонкостях работы JVM, так что если здесь действительно что-то не так, пусть кто-нибуть напишет ответ к этому комментарию. На странице об value классах пишет: Value classes are a new mechanism in Scala to avoid allocating runtime objects.
            0
            Ну это по сути бесплатные тайп-тэги, тоесть без особой необходимости jvm не будет создавать собственно объекты, а просто будет вызывать статические методы на оборачиваемых значениях. Собственно именно об этом и пишут в документации. Мне в 20 минут первого не кажется, что это статическое выделение памяти.

            Плюс если сделать value-класс имплиситом, то все добавленные методы будут работать без создания новых объектов. Что очень приятно.
              0
              Но ведь value class оборачивает примитивы, примитивы создаются на стеке, следовательно value классы создаются на стеке.
                +1
                Почему примитивы? Любые классы.
                  0
                  Вот почему мы друг друга не понимали! Поправил, надеюсь так будет лучше.
        • UFO just landed and posted this here
            +2
            Автор:
            — «экспоненциальных взрывов» — wtf?

            И зачем вообще переводить release notes? Статья была бы ценна, если бы в ней были примеры использования новых фич, более детальное объяснение.

            Вот например «Группы (-groups)» — это что? Я думаю, что любой чел мало знакомый с анлгийским это перевести сможет, а вот рассказать что это было бы полезно.
            0
            В оригинале «no more exponential blow-up!»

            Цель поста — рассказать о том, что вышла новая версия языка программирования. А переводить нужно потому, что статья на хабре по английски выглядела бы, мягко говоря, странно. К тому же, если вы читали оригинальные release notes, то могли заметить, что некоторые примеры и объяснения я все же добавил. К сожалению, я не настолько крут, чтобы рассказывать как делать custom thread pulls для параллельных коллекций или технические подробности нового генератора байт-кода.

            Я также не знаю, что это за группы в новом ScalaDoc и нигде не могу найти о них информации.

            Only users with full accounts can post comments. Log in, please.