2006-05-19
■ [Ruby] Rubyの「クロージャ」再考

以前Rubyで「クロージャ」というエントリを書いたけど、もういちど復習するよ。
昨日の日記で「ブロック」の概念と、「ブロック」をオブジェクト化した「手続きオブジェクト」について復習したけど、この「手続きオブジェクト」には面白い性質があるんだ。
というのは、「手続きオブジェクト」の中から変数を使って別のオブジェクトを参照するような場合、その手続きオブジェクトを生成した「環境」の中の変数は、その「手続きオブジェクト」が生きている間はずっと有効なんだよ。
たとえば
def counter_closure count = 0 f = lambda {|n| count += n } return f end count = 10 counter = counter_closure puts counter.call(1) puts counter.call(2) puts counter.call(3) puts counter.call(4)
のように書くと、実行結果は
1 3 6 10
のようになるよ。counter_closureのメソッド定義内で「count = 0」としてFixnumオブジェクトを参照している変数countは、手続きオブジェクトが生きている間は(手続きオブジェクトの中で)ずっと有効だよ。だから、手続きオブジェクトの外で「count = 10」としても、それは別の変数になるから「手続きオブジェクト内の変数count」の参照先は変わらないんだよ。
こんな風に『「手続きオブジェクトの内部でのみ有効な変数」を包み込んで持っている手続きオブジェクト』のことを、「クロージャ」と呼ぶみたいだよ。
コメント
tanii-takamune2008/10/23 08:04クロージャーについて、よくわからなかったのでバリケンの記事とても参考になりました。ありがとうございます。
トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20060519