Scala示例代码和弃用问题

时间:2011-09-14 21:54:17

标签: scala deprecated

我正在阅读Programming Scala (O'reilly)这是一本非常好的书,很容易理解。

问题在于,有一个关于枚举的例子,这个例子已被窃听,并且作为一个开始真的不知道为什么会这样。

所以,这是代码:

// 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中执行它时(在main方法中)它甚至都没有编译。当我想用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版本?为什么它不能在eclipse上运行?

我的Scala版本是2.8.1.final

2 个答案:

答案 0 :(得分:5)

所以,我在书中找到了它:

  

在版本2.8.0.Beta1-prerelease下,有弃用警告   使用源代码。

作者的回应:

  

是的,显然这是2.8中的API更改。如果您运行该脚本   通过“scala -deprecation ...”,您将更详细地看到警告   (我希望这个标志默认开启)。你必须使用“for(品种&lt; -   Breed.values)“而不是”(品种&lt; - 品种)“和类似的,   “Breed.values.filter”代替“Breed.filter”来消除   警告。但是,值方法在2.7.X中不可用。

答案 1 :(得分:2)

我猜你使用版本2.9 / 2.10的Eclipse插件而不是版本2.8的Eclipse插件,这就是为什么它在旧的Scala发行版中工作,而不是在Eclipse附带自己的版本。

有问题的方法已被弃用,removed subsequently

建议:更新到最新版本(目前为2.9.1)。