7

私には理解できないこの奇妙な状況があります。「ProgramminginScala」の本、Ch。9.9。

私がカリー化された関数を持っているとしましょう:

def withThis(n:Int)(op:Int=>Unit){
      println("Before")
      op(n);
      println("After")
}

特別なカーリー構文内で1つの引数を使用して呼び出すと、期待どおりに機能します。

withThis(5){
   (x) => {println("Hello!"); println(x); }
}
// Outputs
Before
Hello!
5
After

ただし、2つのステートメントを入力すると、奇妙なことがわかります。

withThis(5){
     println("Hello!")
     println(_)
}
// Outputs
Hello!
Before
5
After

どうして「こんにちは!」「Before」の前に印刷され、次に「5」が内部に印刷されますか?私は夢中ですか?

4

2 に答える 2

10

最後のコード例は、期待される結果を生成するために次のように書き直す必要があります。

withThis(5) { x =>
     println("Hello!")
     println(x)
}

それ以外の場合、あなたの例はと同等です

withThis(5) {
     println("Hello!")
     (x: Int) => println(x)
}

プレースホルダー_は、縮退しない方法で可能な限り緊密にバインドするように拡張されます(つまり、に拡張されませんprintln(x => x))。

注意すべきもう1つの点は、ブロックは常に最後の値を返すことです。あなたの例では、最後の値は実際には(x: Int) => println(x)です。

于 2011-04-28T18:23:52.623 に答える
3

2番目の例では、curlies:{ println("Hello!"); println(_) }は「Hello!」を出力するブロックです。そしてカレーを返しますprintln{ println("Hello!"); 5 }「Hello!」を印刷するブロックとして簡略化したと想像してみてください。そして5を返します。

于 2011-04-28T17:59:11.347 に答える