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

clock()-> Возврат числа с плавающей точкой

процессорное время или реальное время начиная с запуска процесса или начиная с первого вызова к clock(). Это имеет столько же точности сколько системные записи.

time()-> Возврат числа с плавающей точкой

текущее время в секундах с Эпохи. Части секунды могут присутствовать, если системные часы обеспечивают их.

Обычно time() более точно, потому что операционные системы не снабжают время выполнения процесса точностью, они хранят системное время (т.е., фактическое время)

58
задан soc 6 July 2011 в 10:49
поделиться

5 ответов

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

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

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

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

33
ответ дан 24 November 2019 в 18:53
поделиться

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

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

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

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

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

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

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

package com.mystuff.java.wrappers

import java.net._

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

package com.mystuff.factories
package ligthbulbs

, который эквивалентен:

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

И, случается, получает обе фабрики и лампочки в прицел.

все оболочки попали в область видимости, а java можно найти внутри com.mystuff . В Scala 2.8 ограничиваются только оболочки . Поскольку иногда вы хотите, чтобы часть остального находилась в Scope, теперь разрешен альтернативный синтаксис package :

package com.mystuff.factories
package ligthbulbs

, который эквивалентен:

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

И, случается, получает обе фабрики и лампочки в прицел.

все оболочки попали в область видимости, а java можно найти внутри com.mystuff . В Scala 2.8 ограничиваются только оболочки . Поскольку иногда вы хотите, чтобы часть остального находилась в Scope, теперь разрешен альтернативный синтаксис package :

package com.mystuff.factories
package ligthbulbs

, который эквивалентен:

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

И, случается, получает обе фабрики и лампочки в прицел.

25
ответ дан 24 November 2019 в 18:53
поделиться

Мне понадобится , чтобы что-то переписать?

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

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

должен стать

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

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

11
ответ дан 24 November 2019 в 18:53
поделиться

На шаг впереди

Когда вы выполняете миграцию, компилятор может предоставить вам некоторую страховку.

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

     s / ^ (package com.example.project. *) \. (\ W +) / $ 1 \ npackage $ 2 / g 
     
  3. Скомпилируйте с компилятором 2.8.0, используя параноидальные параметры командной строки -deprecation -Xmigration -Xcheckinit -Xstrict-warnings -Xwarninit

  4. Если вы получаете сообщение об ошибке, ошибка не может найти неявное значение для параметра свидетельства типа scala.reflect.ClassManifest [T] , вам необходимо для добавления неявного параметра (или, что эквивалентно, привязки контекста) к параметру типа.

    До:

     scala> def listToArray [T] (ls: List [T]): Array [T] = ls.toArray 
     : 5: error: не удалось найти неявное значение для параметра свидетельства типа 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]) (неявный свидетельство $ 1: Manifest [T]) Array [T] 
     
    scala> def listToArray [T] (ls: List [T]) (неявное m: Manifest [T]): Array [T ] = ls.toArray 
    listToArray: [T] (ls: List [T]) (неявный m: Manifest [T]) Array [T] 
     

    Любой метод, вызывающий listToArray и сам принимает T в качестве параметра типа, также должен принимать Manifest как неявный параметр. Подробнее см. SID массивов .

  5. Вскоре вы столкнетесь с такой ошибкой:

     scala> collection.Map (1 -> 2): Map [Int, Int] 
     : 6: error: несоответствие типов; найдено 
    : scala.collection.Map [Int, Int] 
    требуется: Map [Int, Int] 
    collection.Map (1 -> 2): Map [ Int, Int] 
     ^ 
     

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

      объект Predef {
    type Map [A, B] = collection.immutable.Map [A, B] 
    val Map = collection.immutable.Map 
    } {{ 1}} 

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

Получение преимуществ

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

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

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

37
ответ дан 24 November 2019 в 18:53
поделиться

Вот контрольный список от Эрика Виллигерса, который использует 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.collection.jcl *

* Неизменяемая карта .update становится .updated *

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

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

* путь к классам при использовании scala.tools.nsc.Settings *

http://thread.gmane.org/gmane.comp.lang.scala/18245/focus=18247 settings.classpath.value = System.getProperty ("java.class.path")

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

Заменить

list.filter(that.f _)

на

list.filter(that f _)

или

list.filter(that.f(_))

> > >

* Перенести из устаревших методов перечисления итератор map * Использовать методы перечисления values.iterator values.map

* Переход с устаревшего Iterator.fromValues ​​(a, b, c , d) * Используйте Iterator (a, b, c, d)

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

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

Предположим, у нас есть

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 <- ...) *

* Избегайте запятых в конце *

6
ответ дан 24 November 2019 в 18:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: