バリケンのRuby日記 RSSフィード

2006-05-19

[] Rubyの「クロージャ」再考  Rubyの「クロージャ」再考 - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  Rubyの「クロージャ」再考 - バリケンのRuby日記  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-takamunetanii-takamune2008/10/23 08:04クロージャーについて、よくわからなかったのでバリケンの記事とても参考になりました。ありがとうございます。