2011-09-14 10 views
2

私は読んでいますProgramming Scala (O'reilly)これは本当に良い本です。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) 

私はそれもコンパイルされません(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のバージョンを更新しますか?なぜそれが日食で動かないのですか?

スカラ座の私のバージョンは

+0

eclipseプラグインの場合と同様、開発中ですので、実際にはそれに頼ることはできません。 – agilesteel

+0

ええ、それは "厳密モード"にあるようです。または類似のもの。私はコードをコンパイルすることはできません。 – santiagobasulto

答えて

2

私はあなたがそれはあなたの古いScalaの分布で働いていたが、独自のバージョンではないのEclipseに付属理由です、代わりにバージョン2.8のための1つのバージョン2.9/2.10のためのEclipseプラグインを使用すると思います。

問題のメソッドは廃止され、removed subsequentlyです。

提案:最新バージョン(現在は2.9.1)に更新してください。

+0

ありがとう、私はそれを知らなかった。私は2.8が最後のものだと思った。ありがとうございました! – santiagobasulto

+0

@santiagobasulto:ここを見てください:http://www.scala-lang.org/downloads Scala 2.9は2以上の大きな改善点があります。8と並列コレクション! – soc

+0

うわー、本当に大きな変化。私はスカラから始まっていますが、私は "パラレルコレクション"を読んで、私は驚いていました – santiagobasulto

5

だから、私は本の正誤表でそれを見つけた2.8.1.finalです:

バージョンの下で 非推奨警告がある、2.8.0.Beta1、プレリリースソースコード著者からの

応答:

はい、どうやらこれは2.8でAPIの変更です。スクリプト を「scala -deprecation ...」と実行すると、警告がより詳細に表示されます (このフラグがデフォルトでオンになっていたら幸いです)。 "for(品種< - Breed)"ではなく、 "breed.filter"の代わりに "Breed.values.filter"の代わりに "for(品種< - Breed.values)"を使用する必要があります。 の警告。ただし、valuesメソッドは2.7.Xでは使用できません。