2017年1月9日月曜日

Groovy ループ内で生成したクロージャはカリー化して使え


下記のコードの出力結果は、すべて3となる。
def arr = []
for (int i=0; i<3; i++){
    arr << { println i }
}
arr.each { it() }

// 出力結果
// ==> 3
// ==> 3
// ==> 3
クロージャ内の出力関数が実行される時には変数i はすでにインクリメントされたものが出力されるようだ。。


変数i をクロージャの引数として渡すと、うまくいくようで
その為に、カリー化して変数を引数として渡しておく必要がある。
for (int i=0; i<3; i++){
   arr << { i_ -> println i_ }.curry(i)
}
arr.each { it() }

// 出力結果
// ==> 0
// ==> 1
// ==> 2

ループ内で書き換わる変数をクロージャ内で利用する際には、
カリー化して変数を固定しておかないと、あとで呼び出すときに困る。

0 件のコメント:

コメントを投稿