0

取った:

var data = List[(DateTime, Double)]()
val pairs = io.Source.fromInputStream(getClass.getResourceAsStream("/data.csv")).getLines().map(_.split(","))
pairs.foreach(pair => data ::= (dateFormatter.parseDateTime(pair(0)), pair(1).toDouble))

問題ありません。次のように、ペアを宣言する代わりにパラメーター プレースホルダーを使用することにした場合:

pairs.foreach(data ::= (dateFormatter.parseDateTime(_(0)), _(1).toDouble))

コンパイラはそれを受け取りません。さらに、エラー:

too many arguments for method ::: (x: B)List[B]
pairs.foreach(data ::= (dateFormatter.parseDateTime(_(0)), _(1).toDouble))
                   ^

あまり役に立ちません。ここで何が起こっているのですか?アンダースコアを使用して複数のパラメーターを表すことはできないことは理解していますが、ここでは 1 つのパラメーターの代用としてのみ使用されています。コンパイラがこれを受け入れない理由がわかりません。また、呼び出されていないメソッド ::: への参照もわかりません。

4

2 に答える 2

5

クロージャ内のアンダースコアは、宣言順にクロージャのパラメータを参照し、同じパラメータを参照するために使用することはできません。

コンパイラ エラーに関しては、それは method::ではなく、メソッドを参照して:::います。3 番目のコロンは、メソッド名ではなく、エラー メッセージの一部です。代入演算子 が原因で呼び出されています::=

于 2013-08-05T16:38:48.300 に答える
1

パラメーター プレースホルダー_は、パラメーターごとに最大 1 回使用できます。

そのため、最初に表示されたときは最初のパラメーターにマップされ、2 回目に表示されたときは 2 番目のパラメーターにマップされ、以降も同様です。パラメータよりも「_」が多い場合は、コンパイルの問題になります。

于 2013-08-05T16:33:33.487 に答える