2012-08-11 16 views
6

Scalaコードを書く際に、コードをコンパイルしようとすると奇妙なエラーメッセージが表示されます。私はコードをはるかに単純なものに分解しました(意味論的な観点からは全く意味がありませんが、まだエラーを示しています)。forループをコンパイルするときに奇妙なエラーが発生する

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

import scala.collection.mutable.ListBuffer 

val map = scala.collection.mutable.Map[Int, ListBuffer[Int]]() 
for (i <- 1 to 2) { 
    map.get(0) match { 
    case None => map += (1 -> ListBuffer[Int](1)) 
    case Some(l: ListBuffer[Int]) => l += i 
    } 
} 

// Exiting paste mode, now interpreting. 

<console>:12: error: type arguments [Any] do not conform to trait Cloneable's t 
pe parameter bounds [+A <: AnyRef] 
       for (i <- 1 to 2) { 
         ^

forループの最後に余分な行を追加し、コードは動作します:

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

import scala.collection.mutable.ListBuffer 

val map = scala.collection.mutable.Map[Int, ListBuffer[Int]]() 
for (i <- 1 to 2) { 
    map.get(0) match { 
    case None => map += (1 -> ListBuffer[Int](1)) 
    case Some(l: ListBuffer[Int]) => l += i 
    } 
    1 // <- With this line it works 
} 

// Exiting paste mode, now interpreting. 

warning: there were 1 unchecked warnings; re-run with -unchecked for details 
import scala.collection.mutable.ListBuffer 
map: scala.collection.mutable.Map[Int,scala.collection.mutable.ListBuffer[Int]] 
= Map(1 -> ListBuffer(1)) 

私は推測する、それがマッチケース文の戻り値とは何かを持っています。しかし、私はこのエラーメッセージの背後にある理由と私が間違っていることを理解するのに十分なScalaの専門家ではありません。もっと賢明な人がここで助けてくれることを願っています。

エラーメッセージの背景には何がありますか? match-case-statementの何が間違っていますか?

UPDATE:あなたがアクションでthis bugを見ている

+0

これはおそらくバグです。 2.10では正常に動作します。 – sschaef

答えて

6

Scalaの2.9.2でテストされています。これは、2.10で修正されていますし、どこかに型注釈を追加-JUST this answerでの簡単な回避策があります:

for (i <- 1 to 2) { 
    map.get(0) match { 
    case None => map += (1 -> ListBuffer[Int](1)) 
    case Some(l: ListBuffer[Int]) => (l += i): Unit 
    } 
} 
+0

ありがとう、これを指摘してください。 –

関連する問題