火曜日, 3月 20, 2007

脳みそがウニ

新しく買ったAjaxの本を読んでいたら、ActionScriptでのクロージャ、という
説明があった。今までGroovyの説明の中などで何回かその言葉を見たことは
あったのだが、それが何なのかは気にしたことがなかった。「クロージャは
レキシカルスコープと無名関数でできている」と書かれていても、正直、
チンプンカンプンだ。

一見、ただの無名クラスのことなのかと思ったのだが、そうではないみたい。
私の今の理解だと、下記のような感じ。

1)クロージャはプライベートな変数を持っている。
2)クロージャは引数を取る。
3)クロージャの中にはさらに無名関数があり、そこで2)の引数が参照されている。
 また、その参照が残っているが故にクロージャはガーベージコレクションの
 対象にならず、状態を持ったまま存続できる。
4)内側の無名関数は普通に値を返すが、クロージャの返り値は無名関数自体である。

これらの特徴により、「状態」をキープしているモノが簡単に作れるらしい。

宣言などの面倒臭さを極限まで省いて、さらに部品化の粒度を下げることでクラス
よりも再利用性を高めることができるようなのだが、どうもまだ直感的に理解が
できない。3)の特徴っていわゆるメモリリークみたいな状態になったりしないのだ
ろうか?

ウーン、と考えていると脳みそがウニになりそうで疲れる。昔、Javaでクラスの中の
メインメソッドで自身のクラスオブジェクトを作るとか、ダイナミックバインディングが
理解できなかった時のような感覚だ・・・。が、私が先日感嘆したRubyの select の
ループも実はクロージャなのだそうだし、PerlもJavaScriptもクロージャがあり、Java7にクロージャの導入が提言された、と知ると、なんだか理解したい気分になる。

これも一種の征服欲なのだろうか。

これが理解できたら、次なるバズワードは「カレー化関数」だな。