Rubyの呼び出し可能オブジェクトの比較


Ruby 界隈では青木峰郎氏もすごいが、この Yugui 氏も本当にすごい。数学・社会科学・コンピュータの知識を縦横無尽に駆使する博覧強記の人。


Yugui 氏による「Rubyの呼び出し可能オブジェクトの比較」3回シリーズがまた非常によい。


http://idm.s9.xrea.com/ratio/2006/11/14/000541.html
http://idm.s9.xrea.com/ratio/2006/11/19/000547.html
http://idm.s9.xrea.com/ratio/2006/11/29/000558.html


Ruby はコンテキストによって暗黙のレシーバである self やメソッド・クラス変数・定数の登録先クラスが変わるのだが、その変わり方が非常に微妙なのである。これに、特異クラスが絡んでくると頭がウニ状態になる。


私は昔は能天気な Ruby ユーザーで yield をはじめあらゆるメタプログラミングを巧妙に避けてきた。考えれば面倒なことになると知っていたからだ。べつに Perl みたいにテキスト処理に適当に使えればいいじゃん、と気楽に考え、Ruby とはいい友達だと思っていた。


・・・Rails と出会うまでは。私は、Rails の内部構造を理解しないまま使うのがなんとも気持ちが悪くて、ActiveRecord のソースを読み始めたのだが、そこは Rubyメタプログラミングのめくるめく世界だったのである。そして、それが Ruby のいちばん楽しい部分であることに初めて気づいた。(気づくの遅すぎ!と突っ込んでください)


Rails はブロック / Proc / class_eval / define_method / method_missing 等々を使い倒していて、これらの振る舞いの微妙な特徴をつかまないとソースコードが読めないのである。それだけのために、私は過去10日ほどをかけて、青木峰郎氏著「Ruby ソースコード完全解説」(またの名を Ruby Hacker's Guide) を読み、この Yugui 氏著・Rubyの呼び出し可能オブジェクトの比較三部作を読んだのである。Yugui 氏はここで、ブロック / Proc / Method / UnbindMethod の呼び出し可能オブジェクトの相互関係について論じている。また eval / instance_eval / module_eval の微妙な違いについてテストプログラムを通して実証的に論じている。内容は濃く非常に参考になった。


Rubyソースコードを見ていても思ったのだが、どうやらメソッド・定数・クラス変数の定義クラスはそれぞれ別の方法で決められており、Yugui 氏の例示したような微妙なケースでは、振る舞いを直感的に把握しずらい。それでも、だいぶ自分も Ruby を理解してきた、という感覚はつかめてきた。もうちょっと自信をもって Railsソースコード解読に臨めるかもしれない。


Yugui さん、ありがとう!