Каковы самые большие различия между Scala 2.8 и Scala 2.7?
Я написал довольно большую программу на Scala 2.7.5, и теперь я с нетерпением жду версии 2.8. Но мне любопытно, как этот большой скачок в эволюции Scala повлияет на меня.
каковы будут самые большие различия между этими двумя версиями Scala? И, пожалуй, самое главное:
- Я нужно чтобы что-нибудь переписать?
- Я хочу чтобы переписать что-нибудь просто, чтобы воспользоваться некоторыми прохладными новыми особенность?
- каковы именно новые возможности Scala 2.8 в целом?
5 ответов:
вы можете найти предварительный просмотр новой функции в Scala2. 8 (апрель 2009 года), с недавних в этой статье (июнь 2009 года)
- именованные и стандартные аргументы
- Вложенные Аннотации
- Объекты
- @ specialized
- улучшенные коллекции (некоторые переписать может потребоваться здесь)
- REPL будет иметь завершение команды (больше о том, что и другие трюки в этом статья)
- новые абстракции управления (продолжение или перерыв)
- усовершенствования (Swing wrapper, performances, ...)
"переписывание кода" не является обязательством (за исключением использования некоторых улучшенных коллекций), но некоторые функции, такие как продолжение (Википедия: абстрактное представление состояния элемента управления или "остальная часть вычисления" или "остальная часть кода для выполнения") может дать вам некоторые новые помыслы. Хорошее введение найти здесь, написано Даниил (который также написал много более подробный и конкретный ответ в этой теме).
Примечание: Scala на Netbeans Кажется, работает с некоторыми 2.8 nightly-build (против официальная страница для 2.7.x)
принимая прыжок
при переносе компилятор может предоставить вам некоторые системы безопасности.
- скомпилируйте свой старый код против 2.7.7 с
-deprecation, и следуйте рекомендации от всех устарели предупреждение.Обновить код для использования незарегистрированные пакеты. Это можно сделать механическим путем многократного запуска это регулярное выражение поиска заменять.
s/^(package com.example.project.*)\.(\w+)/\npackage /gкомпилировать с помощью компилятора 2.8.0 , использование параметров командной строки paranoid
-deprecation -Xmigration -Xcheckinit -Xstrict-warnings -Xwarninitесли вы получаете ошибки ошибки
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 для подробности.прежде чем слишком долго, вы получите сообщение об ошибке вроде этого:
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, но это действительно деталь реализации.плоды
- замените некоторые методы перегрузки с именованными и параметрами по умолчанию.
используйте созданный
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)- обобщить сигнатуры метода из
ListдоSeqилиIterableилиTraversable. Поскольку классы коллекций находятся в чистой иерархии, можно ли принять более общий тип.- интеграция с библиотеками 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' snetбиблиотека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 <- ...)** избегайте конечных запятых*