clock()
-> Возврат числа с плавающей точкой
процессорное время или реальное время начиная с запуска процесса или начиная с первого вызова к clock()
. Это имеет столько же точности сколько системные записи.
time()
-> Возврат числа с плавающей точкой
текущее время в секундах с Эпохи. Части секунды могут присутствовать, если системные часы обеспечивают их.
Обычно time()
более точно, потому что операционные системы не снабжают время выполнения процесса точностью, они хранят системное время (т.е., фактическое время)
Здесь вы можете найти предварительную версию новой функции в Scala2.8 (апрель 2009 г.), дополненную недавней этой статьей (июнь 2009 г.)
«Переписывание кода» не является обязательным (за исключением использования некоторых улучшенных коллекций), но некоторые функции, такие как продолжение ( Википедия : абстрактное представление состояния управления, или «остальная часть вычислений» или «остальной код, который нужно выполнить ") может дать вам несколько новых идей. Хорошее введение можно найти здесь , написанное Дэниелом (который также опубликовал гораздо более подробный и конкретный ответ в этой теме).
Примечание: Scala на Netbeans , похоже, работает с некоторыми ночными сборками 2.8 (по сравнению с официальной страницей для 2.7.x )
Ответ 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 {
...
}
}
И, случается, получает обе фабрики
и лампочки
в прицел.
Мне понадобится , чтобы что-то переписать?
def takesArray(arr: Array[AnyRef]) {…}
def usesVarArgs(obs: AnyRef*) {
takesArray(obs)
}
должен стать
def usesVarArgs(obs: AnyRef*) {
takesArray(obs.toArray)
}
Мне нужно было посетить канал IRC для этого, но потом понял, что надо было начать здесь.
Когда вы выполняете миграцию, компилятор может предоставить вам некоторую страховку.
-deprecation
и следуйте рекомендациям
из всех предупреждений об устаревании
. Обновите свой код, чтобы использовать незакрепленных пакетов. Это можно сделать механически, многократно выполняя поиск по регулярному выражению replace.
s / ^ (package com.example.project. *) \. (\ W +) / $ 1 \ npackage $ 2 / g
Скомпилируйте с компилятором 2.8.0, используя параноидальные параметры командной строки -deprecation -Xmigration -Xcheckinit -Xstrict-warnings -Xwarninit
Если вы получаете сообщение об ошибке, ошибка не может найти неявное значение для параметра свидетельства типа 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 массивов .
Вскоре вы столкнетесь с такой ошибкой:
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
, но на самом деле это деталь реализации.
Используйте сгенерированный метод copy
классов case.
scala> case class Foo (a: Int, b: String)
определенный класс Foo
scala> Foo (1, "a"). Copy (b = "b")
res1: Foo = Foo (1, b)
List
в Seq
или ] Iterable
или Traversable
. Поскольку классы коллекций находятся в чистой иерархии, можете ли вы принять более общий тип. Есть много других новых функций, которые можно спокойно игнорировать при начале миграции, например @specialized
и Continuations.
Вот контрольный список от Эрика Виллигерса, который использует 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 <- ...)
** Избегайте запятых в конце *