2014年11月23日(日)
クロージャ
備忘録 | |
クロージャに関する備忘録。
g = -> { count = 0 ; -> n { count += n } } # クロージャを作るラムダ f1 = g.() # クロージャ f1 を作る f1.(1) #=> 1 f1.(1) #=> 2 f2 = g.() # クロージャ f2 を作る f2.(10) #=> 10 f2.(11) #=> 21 f1.(10) #=> 12
f2.(10) の戻り値は 12 でないし、最後の f1.(10) の戻り値も 21 でない。
エンクロージャ(クロージャを包む環境)は、g が「呼び出された環境」で g が静的に定義されている環境ではない、と考える。(C 言語の 関数内/ファイル内 static 変数とは違う)
もう一つ。
g2 = -> { count = 0; [ -> n { count += n }, -> n { count += n } ] } f1, f2 = g2.() # クロージャ f1, f2 を作る f1.(1) #=> 1 f1.(1) #=> 2 f2.(10) #=> 12 f2.(11) #=> 23 f1.(10) #=> 33
この場合は、f1, f2 とも同じエンクロージャをもつのでカウンタを共有している。
コメント