Каковы самые большие различия между Scala 2.8 и Scala 2.7?


Я написал довольно большую программу на Scala 2.7.5, и теперь я с нетерпением жду версии 2.8. Но мне любопытно, как этот большой скачок в эволюции Scala повлияет на меня.

каковы будут самые большие различия между этими двумя версиями Scala? И, пожалуй, самое главное:

  • Я нужно чтобы что-нибудь переписать?
  • Я хочу чтобы переписать что-нибудь просто, чтобы воспользоваться некоторыми прохладными новыми особенность?
  • каковы именно новые возможности Scala 2.8 в целом?
5 58

5 ответов:

вы можете найти предварительный просмотр новой функции в Scala2. 8 (апрель 2009 года), с недавних в этой статье (июнь 2009 года)

  • именованные и стандартные аргументы
  • Вложенные Аннотации
  • Объекты
  • @ specialized
  • улучшенные коллекции (некоторые переписать может потребоваться здесь)
  • REPL будет иметь завершение команды (больше о том, что и другие трюки в этом статья)
  • новые абстракции управления (продолжение или перерыв)
  • усовершенствования (Swing wrapper, performances, ...)

"переписывание кода" не является обязательством (за исключением использования некоторых улучшенных коллекций), но некоторые функции, такие как продолжение (Википедия: абстрактное представление состояния элемента управления или "остальная часть вычисления" или "остальная часть кода для выполнения") может дать вам некоторые новые помыслы. Хорошее введение найти здесь, написано Даниил (который также написал много более подробный и конкретный ответ в этой теме).

Примечание: Scala на Netbeans Кажется, работает с некоторыми 2.8 nightly-build (против официальная страница для 2.7.x)

принимая прыжок

при переносе компилятор может предоставить вам некоторые системы безопасности.

  1. скомпилируйте свой старый код против 2.7.7 с -deprecation, и следуйте рекомендации от всех устарели предупреждение.
  2. Обновить код для использования незарегистрированные пакеты. Это можно сделать механическим путем многократного запуска это регулярное выражение поиска заменять.

    s/^(package com.example.project.*)\.(\w+)/\npackage /g
    
  3. компилировать с помощью компилятора 2.8.0 , использование параметров командной строки paranoid -deprecation -Xmigration -Xcheckinit -Xstrict-warnings -Xwarninit

  4. если вы получаете ошибки ошибки could not find implicit value for evidence parameter of type scala.reflect.ClassManifest[T], вам нужно добавить неявный параметр (или, что то же самое, связанный контекст), на параметр типа.

    перед:

    scala> def listToArray[T](ls: List[T]): Array[T] = ls.toArray
    <console>:5: error: could not find implicit value for evidence parameter of type         scala.reflect.ClassManifest[T]
           def listToArray[T](ls: List[T]): Array[T] = ls.toArray                                              ^
    

    после:

    scala> def listToArray[T: Manifest](ls: List[T]): Array[T] = ls.toArray
    listToArray: [T](ls: List[T])(implicit evidence: Manifest[T])Array[T]
    
    scala> def listToArray[T](ls: List[T])(implicit m: Manifest[T]): Array[T] = ls.toArray          
    listToArray: [T](ls: List[T])(implicit m: Manifest[T])Array[T]
    

    любой метод, который называет listToArray, а сама берет T в качестве параметра типа необходимо также принять манифест в качестве неявного параметра. Смотрите массивы SID для подробности.

  5. прежде чем слишком долго, вы получите сообщение об ошибке вроде этого:

    scala> collection.Map(1 -> 2): Map[Int, Int]
    <console>:6: error: type mismatch;
     found   : scala.collection.Map[Int,Int]
     required: Map[Int,Int]
           collection.Map(1 -> 2): Map[Int, Int]
                 ^
    

    вы должны понимать, что тип Map - это псевдоним в Predef для collection.immutable.Map.

     object Predef {
         type Map[A, B] = collection.immutable.Map[A, B]
         val Map = collection.immutable.Map
     }
    

    есть три типа с именем Map -- только для чтения интерфейс: collection.Map, непреложный реализации: collection.immutable.Map, и изменяемая реализация:collection.mutable.Map. Кроме того, библиотека определяет поведение в параллельном наборе признаков MapLike, но это действительно деталь реализации.

плоды

  1. замените некоторые методы перегрузки с именованными и параметрами по умолчанию.
  2. используйте созданный copy метод классов case.

      scala> case class Foo(a: Int, b: String)
      defined class Foo
    
      scala> Foo(1, "a").copy(b = "b")
      res1: Foo = Foo(1,b)
    
  3. обобщить сигнатуры метода из List до Seq или Iterable или Traversable. Поскольку классы коллекций находятся в чистой иерархии, можно ли принять более общий тип.
  4. интеграция с библиотеками Java с помощью аннотаций. Теперь вы можете указать вложенные аннотации и иметь мелкозернистой контроля над тем, предназначены ли аннотации для полей или методов. Это помогает использовать Spring или JPA с кодом Scala.

есть много других новых функций, которые можно безопасно игнорировать при запуске миграции, например @specialized и продолжений.

ответ VonC трудно улучшить, поэтому я даже не буду пытаться. Я расскажу о некоторых других вещах, не упомянутых им.

во-первых, некоторые устаревшие вещи пойдут. Если у вас есть предупреждения в коде, то скорее всего он больше не будет компилироваться.

далее, библиотека Scala расширяется. В основном, общие небольшие шаблоны, такие как перехват исключений в Either или Option, или преобразование AnyRef в опцию с null отображенные в None. Все эти вещи может в основном пройти незамеченным, но я устаю от публикации чего-то в блоге, а позже кто-то скажет мне, что это уже на Scala 2.8. Ну, на самом деле, я не получаю надоело из него, но, скорее, и к счастью, привык к нему. И я не говорю здесь о коллекциях, которые are получение серьезной ревизии.

вот это б будет приятно, если люди разместили реальные примеры таких улучшений библиотеки, как ответы. Я бы с радостью проголосовал все такие ответы.

REPL не получает только завершение команды. Он получает много вещей, включая возможность исследовать AST для объекта или возможность вставлять точки останова в код, которые попадают в REPL.

кроме того, компилятор Scala модифицируется, чтобы обеспечить быструю частичную компиляцию IDE, что означает, что мы можем ожидать, что они станут гораздо более "осведомленными" о Scala-путем запроса самого компилятора Scala о код.

package com.mystuff.java.wrappers

import java.net._

вы импортируете не Java net библиотеки, но com.mystuff.java ' s net библиотека com,com.mystuff,com.mystuff.java и com.mystuff.java.wrappers все попали в поле зрения, и java внутри com.mystuff. Со Scala 2.8, только wrappers получает распространение. Так, иногда, вы хотите, чтобы некоторые из остальных чтобы быть в области, альтернатива package синтаксис разрешен:

package com.mystuff.factories
package ligthbulbs

что эквивалентно:

package com.mystuff.factories {
  package lightbulbs {
    ...
  }
}

и случается получить оба factories и lightbulbs в область.

Я нужно чтобы что-нибудь переписать?

def takesArray(arr: Array[AnyRef]) {…}

def usesVarArgs(obs: AnyRef*) {
    takesArray(obs)
}

должен быть

def usesVarArgs(obs: AnyRef*) {
    takesArray(obs.toArray)
}

Я должен был посетить канал IRC для этого, но потом понял, что я должен был начать здесь.

вот контрольный список от Эрика Уиллиджерса, который использует Scala с 2.2. Некоторые из этих вещей будут казаться датированными более поздними пользователями.

* явный импорт из внешних пакетов *

предположим, что мы

package a
class B

изменить

package a.c
class D extends B

до

package a.c
import a.B
class D extends B

или

package a
package c
class D extends B

* используйте полное имя пакета при импорте из внешнего пакета *

предположим, что мы

package a.b
object O { val x = 1 }

изменить

package a.b.c
import b.O.x

до

package a.b.c
import a.b.O.x

* при явном указании параметров типа в вызовах метода контейнера добавьте новые параметры типа *

изменить

list.map[Int](f)

до

list.map[Int, List[Int]](f)

изменить

map.transform[Value](g)

до

map.transform[Value, Map[Key, Value]](g)

* создание отсортированной карты с помощью упорядочивания вместо преобразования в упорядоченный *

 [scalac]  found   : (String) => Ordered[String]
 [scalac]  required: Ordering[String]
 [scalac]         TreeMap[String, Any](map.toList: _*)(stringToCaseInsensitiveOrdered _)

* импорт неявных преобразований, заменяющих scala.коллекция.jcl*

* Неизменную Карту .обновление становится .усовершенствованный *

*** миграция из новых устаревших методов списка --
* elements * remove * sort * List.flatten(someList) * List.fromString(someList, sep) * List.make

*** использовать методы список * diff * iterator * filterNot * sortWith * someList.flatten * someList.split(sep) * List.fill

* classpath при использовании scala.инструменты.совет национальной безопасности.Настройки *

http://thread.gmane.org/gmane.comp.lang.scala/18245/focus=18247 настройки.путь класса.система ценностей.getProperty ("java.класс.путь")

* избегайте ошибок: _ должен следовать методу; не может следовать (любой) => Boolean *

заменить

list.filter(that.f _)

с

list.filter(that f _)

или

list.filter(that.f(_))

> > >

* миграция из устаревших методов перечисления iteratormap* Используйте методы перечисления values.iteratorvalues.map

* миграция из устаревшего Iterator.fromValues(a, b, c, d)* Используйте Iterator(a, b, c, d)

* избегать устаревшего типа Collection* Используйте

* изменить порядок инициализации *

предположим, что мы

trait T {
  val v
  val w = v + v
}

заменить

class C extends T {
  val v = "v"
}

с

class C extends {
  val v = "v"
} with T

* избежать ненужных val на for (val x <- ...)*

* избегайте конечных запятых*