0

次の関数呼び出しはすべて同じですが、その理由がわかりません。

val list = List(List(1), List(2, 3), List(4, 5, 6))

list.map(_.length)   // res0 = List(1,2,3) result of 1st call

list map(_.length)   // res1 = List(1,2,3) result of 2nd call

list map (_.length)  // res2 = List(1,2,3) result of 3rd call

map はクラス List のメンバー関数であるため、通常の関数呼び出しである最初の呼び出しを理解できます

しかし、2回目と3回目の呼び出しは理解できません。たとえば、3 回目の呼び出しで、"(_.length)" が "map" のパラメーターであることを Scala コンパイラーはどのようにして知ることができるでしょうか? 「マップ」が「リスト」のメンバー関数であることをコンパイラはどのように知ることができますか?

4

2 に答える 2

2

バリアント 2 と 3 の唯一の違いは、括弧の前の空白ですか? list aこれは区切り文字にしかできません -listaもちろん違いますが、開き括弧は新しいトークンであり、空白を 1 つまたは 2 つまたは 3 つ前に配置することも、何も配置しないこともできます。ここでどのように違いを期待できるかわかりません。

Javaでは、違いはありません

 System.out.println ("foo"); 

// と

 System.out.println("foo"); 

それも。

于 2012-05-06T23:04:14.433 に答える
0

これが演算子表記です。それが機能する理由は、機能する理由と同じ2 + 2です。

スペースは単語を区別するために使用されます --listmap(_.length)コンパイラはlistmap. しかし、 と書くlist++listと、 も同様に機能しますlist ++ list

したがって、演算子表記法を使用している場合、単語を区切るためにスペースが必要ですが、そうでない場合は存在する場合と存在しない場合があります。

于 2012-05-08T20:35:07.827 に答える