06/05/21 03:36:44
おればかだから>>12,27,33,36の話がよくわかんなくて、groovyでコード
>>12の参照先とほぼ同じ書いてみてやっと分かった。
def closures = []
for( i in 0..10) {
closures[i] = { println i }
}
for( c in closures) {
c()
}
結果は同じように10がずらっと表示された。
これは、closuresに入っている各クロージャは、クロージャ外側の変数 i に
そのままアクセスできるわけだけど、実際に実行されるc()の段階では、
i は既に10になっちゃってるから、これがずらっと表示されると考えて
やっとしっくりきた。
>>56は
def makeCounter( start) {
return { n -> return start += n }
}
def closure = makeCounter(0)
println( closure(1))
println( closure(2))
ってな感じなんで、つまりクロージャから参照された変数 start は、変数自体がスコープを
越えてもクロージャ内では普通につかえるし、クロージャがある限り存在しつづける、と。
インナークラスがエンクロージングクラスのインスタンス変数にアクセスできるようなもん
だけど、クロージャにはクロージャのスコープがあるので、一度クロージャが使った変数は
クロージャ内で存在し続ける、ということか。