クロージャのわかりにくさ
2007/12/16
クロージャという言葉は、なんとなく神秘的なイメージがある気がする。だから使ってみたいと思わせる言葉なのかもしれません。(だから周期的に話題になる)
以前、クロージャって何だろうと調べたときも、なんとなく抽象的ではぐらかされているような説明が多くて、スッキリしなかったのを覚えてます。
今の自分のクロージャに対する理解を書いてみます。
クロージャとは
誤解を恐れずに書いてしまうと、クロージャという機能が提供されている訳ではない。クロージャというのは、ある機能の副作用を用いたテクニックの名前である。
クロージャと呼ばれているテクニックが使える言語は、以下の機能を提供しています。言い換えると、以下の機能の副作用によってクロージャというテクニックを使用できるようになります。
- レキシカルスコープ(静的スコープ)
- 関数がファーストクラスオブジェクト(第一級オブジェクト)である。(wikipediaの説明の全てを満たしてなくてもいいが「変数に格納可能である。」「プロシージャや関数の戻り値として返すことができる。」は必須)
クロージャの概念が理解できない人は、上記の2点を理解してからクロージャの説明を読むと理解しやすいのではないかと思います。(と書いて逃げておく)
追記というか、まとめ
ということで、クロージャがわかりにくいのは、言語がクロージャという機能を提供しているのではないからなのではないかと感じています。実際、自分がクロージャを使ってプログラムを書いている時も、頭の中ではレキシカルスコープと関数にフォーカスして考えています。
クロージャを知ってる人が、あんまり、クロージャ、クロージャ言うのは、有害なのではないかと思いました。
こんにちは。
正直このエントリだけ見てもやはり直感的に理解できなかったですが、「第一級オブジェクト」がどこに関わってくるのか追ううちに見えてきました。ありがとうございました。
(・・・とはいえ、まだ厳密な意味ではまだぼやっとしているので十分な理解はできていないような気はしています)
「関数の戻り値として返すことができる(第一級オブジェクト)」「静的スコープ」・・・は、「スコープ内で閉じられた関数”自身”をオブジェクトとして返し、外部から関数を直接呼び出せるようにする」かつ「呼び出された関数は、スコープ内で閉じられた変数の方を(優先的に?)参照する」・・・ってことですよね。
クロージャの実装例の解説は、クロージャの概念を掴むまではWikiPediaの説明の方がわかりやすく、掴んだ後ははてなの説明の方がわかりやすいと感じました。
「やっとわかった」さん。コメントありがとうございます!
> 正直このエントリだけ見てもやはり直感的に理解できなかったですが、
あぁ、そうでしょうね。すみません。私も詳しく説明するのを逃げてしまったので、このエントリだけでわかってしまう人は居ないと思いますorz.
> は、「スコープ内で閉じられた関数”自身”をオブジェクトとして返し、外部から関数を直接呼び出せるようにする」かつ
> 「呼び出された関数は、スコープ内で閉じられた変数の方を(優先的に?)参照する」
> ・・・ってことですよね。
はい、そうだと思います。違ってはいないと思いますが、私の理解と全く同じでもないような気がします。
でも、「やっとわかった」さんのおかげで、もうちょっと真面目に説明してみようかなという気持ちになったので、エントリ書いてみました。よかったら読んでみてください。
http://d.hatena.ne.jp/smeghead/20071219/closure2