手紙の数字の面量の略記形式を使う時注意しなければならない問題
940 ワード
整数リストintListとして、各要素の値を印刷する、各要素の値に1を加算する必要がある.このようなコードを書くかもしれません.
しかし、予想される結果は得られません.
どうしてこんなことになったの?この二つの書き方は等価ではないか.逆コンパイルすると、最初の書き方のprintln(x)がmapの前に実行される、つまり最初の書き方のprintln(x)はmapのパラメータの一部ではないことがわかります.実際、scalaは最初の書き方を以下のように翻訳します.
もちろん、以下の2つの書き方は、先ほど述べた書き方と効果的に同じです.
注意:ここではmapを呼び出す前にf 2(またはf 3)を実行し、Int=>Intの関数インスタンスを返し、この関数インスタンスをパラメータとしてmapに渡します.
2つ目の書き方は、次の書き方と効果的に同じです.
注意:ここでは直接関数ddをパラメータとしてmapに渡す
(1 to 10) map { println(x); _ + 1 }
しかし、予想される結果は得られません.
(1 to 10) map { x => println(x); x + 1 }
どうしてこんなことになったの?この二つの書き方は等価ではないか.逆コンパイルすると、最初の書き方のprintln(x)がmapの前に実行される、つまり最初の書き方のprintln(x)はmapのパラメータの一部ではないことがわかります.実際、scalaは最初の書き方を以下のように翻訳します.
val f1 = { println(x); x : Int => x + 1 }
(1 to 10) map { f1 }
もちろん、以下の2つの書き方は、先ほど述べた書き方と効果的に同じです.
val f2 = { println(x); x : Int => x + 1 }
(1 to 10) map { f2 }
def f3() = { println(x); x : Int => x + 1 }
(1 to 10) map { f3() }
注意:ここではmapを呼び出す前にf 2(またはf 3)を実行し、Int=>Intの関数インスタンスを返し、この関数インスタンスをパラメータとしてmapに渡します.
2つ目の書き方は、次の書き方と効果的に同じです.
def dd(x: Int) = { println(x); x + 1 }
(1 to 10) map { dd }
注意:ここでは直接関数ddをパラメータとしてmapに渡す