0

この質問は、メソッド連鎖における表記法に関する推奨事項ではなく、この特定のケースを理解することに関するものです。

Scala と Play を約 2 週間学習しています。私は 2011 年に scala で 1 か月の学習経験があります。

この行が機能しない理由がわかりません

    List(1,2,3) map {x=>x*2}.filter((x:Int)=>x==2)

しかし、これは機能しています

    List(1,2,3).map{x=>x*2}.filter((x:Int)=>x==2)

考えられる理由の 1 つは、結果のコレクションではなく、関数値に対してフィルターが呼び出されていることです。

スペース表記とドット表記が混在している場合にまだ機能しないのはなぜですか? 純粋なスペースまたはドット表記を保持すると、それ以外の場合は機能しません。

いたるところに純粋な表記しか見られなかったとしたら、混乱することはなかったでしょう。特に Play のコードベースで混合表記を見てきました。私は何が欠けていますか?

4

1 に答える 1

3

期待どおりに動作します。

この行:

List(1,2,3) map {x=>x*2}.filter((x:Int)=>x==2)

意味

List(1,2,3) map ( {x=>x*2}.filter((x:Int)=>x==2) )

これは間違いなくエラーですが、次のように使用できます。

val f1 = (x: Int) => x * 2
val f2 = (x: Int) => x + 2

List(1,2,3) map f1.andThen(f2) // List(1,2,3).map( f1.andThen(f2) )
//List[Int] = List(4, 6, 8)

このコードは、2 つの関数の合成として新しい関数を作成し、それにメソッドを{(x: Int)=>x*2}.andThen((x:Int)=> x + 2)適用します。map

スペースまたはドット表記を混在させることもできますが、ドットの「優先度」が高いことを知っておく必要があります。

于 2013-06-18T10:38:11.320 に答える