Hatena::Grouprubyist

Going My Ruby Way このページをアンテナに追加 RSSフィード

Ruby ロゴ (C) Ruby Association LLC

2014年11月23日(日)

クロージャ

| 07:17 |  クロージャ - Going My Ruby Way を含むブックマーク はてなブックマーク -  クロージャ - Going My Ruby Way  クロージャ - Going My Ruby Way のブックマークコメント

クロージャに関する備忘録。

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 とも同じエンクロージャをもつのでカウンタを共有している。