メソッドとクロージャとオブジェクト
- ときどきの雑記帖 i戦士篇: Rubyについて Part 33 (http://www.kt.rim.or.jp/~kbk/zakkicho/08/zakkicho0811c.html#D20081125-5)
メソッドとクロージャに関して、
表層的には
・ブロックが関数と同等でない(ブロックをとれないなど)
・内部関数(Schemeのinternal defineみたいの)を書けない
Rubyに純粋な意味での「関数」は無いからね。
文の塊をつくる手段は所属するオブジェクトが必要な「メソッド」と
オブジェクトそのものである「ブロック/Proc」の2種類。
というのもRubyで「メソッド=クロージャ」…としてしまうと
public属性にアクセスできない=クロージャにもアクセスできなくなるんだよね。
確か『初めてのRuby』にメソッドはファーストクラスオブジェクト(以下FCO)ではないが、ProcオブジェクトにしてしまえばFCOになるので問題ないみたいなことが書いてあったような気がするが、それほど単純ではないらしい。
実装側がメソッドとクロージャで違うのはまだ良いとして、呼び出し側で呼び出し方が違うのはいただけない。しかし、メソッド=クロージャとするとpublic属性にアクセスできないってどういうことだろう?
Groovyは確か属性(インスタンス変数)がデフォルトでプロパティになるのでgetterをオーバーライドしなければ直接値が見えるということだったと思う。Rubyと似ているが、Rubyはわざわざattr_getterを呼び出してあげないといけないので、デフォルトで見えないようになっていて、挙動としてはデフォルトの扱いが違うというだけだと思う。Groovyでもメソッドとクロージャの区別あるのだろうか?
あと内部関数を書けないというのを調べたら、関数内で関数をdefで定義できないと書いてあった。lambdaやProcならできるらしいが、これは混乱の元だと思う。実際irbで試したらエラーが起きなかったが、正しい挙動をしてくれない。Ruby 1.8.6でしか調べてなく1.9では不明。その辺、整理されたのだろうか?メソッドとクロージャと関数を表面上は同じ扱いとして欲しい。