我正在阅读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)
Run Code Online (Sandbox Code Playgroud)
当我尝试在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
Run Code Online (Sandbox Code Playgroud)
所以,我读了这个并更改了代码,它现在工作正常,更改是:
// 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)
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我将执行代码放在main方法中.
现在,为什么呢?适用于Scala的版本?我应该为其他例子担心吗?更新我的Scala版本?为什么它不会在eclipse上运行?
我的Scala版本是2.8.1.final
所以,我在书上的勘误表中找到了它:
在版本2.8.0.Beta1-prerelease下,有源代码的弃用警告.
作者回复:
是的,显然这是2.8的API变化.如果您使用"scala -deprecation ..."运行脚本,您将更详细地看到警告(我希望此标志默认处于启用状态).您必须使用"for(品种< - Breed.values)"代替"for(品种< - 品种)",同样地,使用"Breed.values.filter"代替"Breed.filter"来消除警告.但是,值方法在2.7.X中不可用.