2012-01-04 5 views
6

私が絶えずスカラに踏み込んだ問題の1つはラムダ式です。例えば_(アンダースコア)を使用している場合、「拡張関数のパラメータタイプが見つかりません」?

JarBuilder.findContainingJar(clazz).foreach {userJars = userJars + _ } 

は私のようなエラー与える:

missing parameter type for expanded function ((x$1) => userJars.$plus(x$1)) 

をしかし、私は自分自身の拡張を行う場合:

JarBuilder.findContainingJar(clazz).foreach {x => userJars = userJars + x } 

は、それが正常に動作します。

これはScalaのバグですか?あるいは、私はひどく間違ったことをしていますか?

+1

を検討する必要があります達成しようとしているかを考えると

は '_'あなたはそれがある意味どう思うかという意味ではありません。その文脈では*特別なシンボルです:*他の単純な識別子はうまく動作するはずです*。この魔法のおかげで、「Some(4).foreach(_ +:List())」は「うまくいく」。参照するには、 'Some(4).map(_ + 1)'と 'Some(4).map(x => x + 1)'を比較してください。うまくいけば、これは重複している(そしてそのように閉じられている)、またはSLSから引き出す素敵な答えがあるでしょう:) –

+1

http://stackoverflow.com/questions/7695270/underscore-in-list-filter(good)、http ://stackoverflow.com/questions/4422016/scala-underscore-minimal-function、http://stackoverflow.com/questions/6593277/concise-notation-for-single-arg-anonymous-function-avoiding-underscore-not - –

+0

(実際には、 '_'が*別の方法で*魔法ではない* *文脈があるかどうか疑問に思う*) –

答えて

6

匿名関数のプレースホルダー構文には、の使用が制限されています。コードでは、式と同じではない代入ステートメントでワイルドカードを使用しようとしています。

エラーをよく調べると、割り当ての右側の式が無名関数に展開されていることがわかります。あなたはしかし、あなたは以下の

userJars = userJars ++ JarBuilder.findContainingJar(clazz) 
+0

ありがとうございます。 "findContainJar"はList [T]ではなくOption [T]を返すので、あなたの++解決法は機能しません。 – Heptic

+0

オプションは、必要なとき暗黙的にIterableに変換する必要があります。これは2.9.0.1で動作するようです –

関連する問題