Пример кода Scala и проблемы с устареванием

Я читаю Программирование Scala (О'рейли). Это действительно хорошая книга, и за ней легко следовать.

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

Итак, вот код:

// code-examples/Rounding/enumeration-script.scala

object Breed extends Enumeration {
  val doberman = Value("Doberman Pinscher")
  val yorkie = Value("Yorkshire Terrier")
  val scottie = Value("Scottish Terrier")
  val dane = Value("Great Dane")
  val portie = Value("Portuguese Water Dog")
}

// print a list of breeds and their IDs
println("ID\tBreed")
for (breed <- Breed) println(breed.id + "\t" + breed)

// print a list of Terrier breeds
println("\nJust Terriers:")
Breed.filter(_.toString.endsWith("Terrier")).foreach(println)

Когда я пытаюсь выполнить его в eclipse (внутри основного метода), он даже не компилируется. Когда я хочу выполнить скрипт с scala Команда работает, но говорит, что есть предупреждения об устаревании. Так что я выполняю это снова с -deprecation флаг и показывает предупреждения:

>> scala -deprecation enumeration-script.scala
/home/{me}/code/enumeration-script.scala:13: warning: method foreach in class Enumeration is deprecated: use values.foreach instead
for (breed <- Breed) println(breed.id + "\t" + breed)
              ^
/home/{me}/code/enumeration-script.scala:17: warning: method filter in class Enumeration is deprecated: use values.filter instead
Breed.filter(_.toString.endsWith("Terrier")).foreach(println)
      ^
two warnings found
ID  Breed
0   Doberman Pinscher
1   Yorkshire Terrier
2   Scottish Terrier
3   Great Dane
4   Portuguese Water Dog

Just Terriers:
Yorkshire Terrier
Scottish Terrier

Итак, я прочитал это и изменил код, и теперь он работает нормально, изменения:

// code-examples/Rounding/enumeration-script.scala

object Breed extends Enumeration {
  val doberman = Value("Doberman Pinscher")
  val yorkie = Value("Yorkshire Terrier")
  val scottie = Value("Scottish Terrier")
  val dane = Value("Great Dane")
  val portie = Value("Portuguese Water Dog")
  def main(args: Array[String]) {
    // print a list of breeds and their IDs
    println("ID\tBreed")
    for (breed <- Breed.values) println(breed.id + "\t" + breed)

    // print a list of Terrier breeds
    println("\nJust Terriers:")
    Breed.values.filter(_.toString.endsWith("Terrier")).foreach(println)
  }
}

Обратите внимание, что я поместил код выполнения внутри main метод.

Теперь, почему это? Это для версии Scala? Должен ли я волноваться за другие примеры? Обновить мою версию Scala? Почему это не работает на затмение?

Моя версия Scala 2.8.1. Финал

2 ответа

Решение

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

Рассматриваемый метод устарел и впоследствии был удален.

Предложение: Обновить до последней версии (в настоящее время 2.9.1).

Итак, я нашел это в книге ошибок:

В версии 2.8.0.Beta1-prerelease имеются предупреждения об устаревании с исходным кодом.

Ответ от автора:

Да, по-видимому, это изменение API в 2.8. Если вы запустите скрипт с "scala -deprecation ...", вы увидите предупреждения более подробно (я бы хотел, чтобы этот флаг был включен по умолчанию). Вы должны использовать "for (breed<- Breed.values)" вместо "for (breed <- Breed)" и аналогичным образом "Breed.values.filter" вместо "Breed.filter" для устранения предупреждений. Однако метод значений недоступен в 2.7.X.

Другие вопросы по тегам