-Rubyはやはり難しいです。記号が多い点があげられます(http://www.ruby-lang.org/ja/man/html/Ruby_A4C7BBC8A4EFA4ECA4EBB5ADB9E6A4CEB0D5CCA3.html#a.3a)。一般的には、記号の多さは可読性を落とす気がします。(Railsが顕著すぎるのかもしれませんが)メタプログラミングの多用があります。メタプログラミングはクールですが、一般的には分かりやすいコードとは言えません。個人的見解ですが、そもそも未だに動的型言語が正しいとは思えていません。変数の型を明示しないことが便利に働く場面があることは認めます。Cで言えば、プリプロセッサマクロやvoidポインタで多態的なコードを書くような場面です。多く見積もっても、型を明示しないことが便利なケースは全体の20%程度だと思います。20%は結構多く見積もっているつもりです。残り80%は、変数に型を明示した方が可読性が上がると思います。書く側にも読む側にも安心感が得られるからです。コンパイルさえ通せば、想定している型と違うオブジェクトだったという、あまりに基本的なバグから(ほぼ)逃れられます。ぼくがプログラミングで最も重視するのは、読み手のコストです。読み手のコストを減らすためには、書き手は相当のコストを背負っても良いと思っています。Ruby大嫌い人間みたいですが、Rubyの話です。Railsのpluginのコードの話です。acts_as_listを例にコードを見てみます。コード例はv2.0.2ベースです。init.rbは以下のようになっています。}これを呼び出す場所は調べていませんが、pluginsディレクトリ下にあるinit.rbをロードする処理がどこかにあるはずです。相対パスを挿入しています。次の行で相対パスのlist.rbファイルをロードします。list.rbファイルは後で見ます。モジュールをincludeしています。ActiveRecord::Baseのクラスオブジェクトを参照しています。ここは、次のように書いてもいいはずです。ActiveRecord::Acts::Listendlist.rbの骨子だけ抜き出すと次のようなコードになっています(コメントはごっそり削除)。endendこのコードをぱっと見て、どこがどんなタイミングで呼ばれるかすぐに分かればすごいです。少なくともぼくは分かりません。Rubyの考え方として、上のinit.rbからrequireされたタイミングで、list.rbのコードがすべて評価される(実行される)と考えてください。実際のlist.rbの中にはdefしかないので、defの中身はメソッド定義として評価され、中身が実行されるのは各メソッドが呼ばれた時になります。init.rbの3行目のincludeのタイミングで呼ばれることです。includedメソッドの動作は次のようにirbで確認できます。クラスオブジェクトを参照しています。extendはオブジェクトにモジュールを加えるメソッドです。この場合、クラスオブジェクトにモジュールをextendしているので、意味的には次と同じ処理になります。endendClassMethodsの中にはacts_as_listがあります。これは次のように呼ばれることを想定しています(Booksは開発者が作るクラス)。acts_as_listend上のように呼ばれると、acts_as_list内のclass_evalが実行されます。意味的には次のようなincludeと同じになります。ActiveRecord::Acts::List::InstanceMethodsendこれでめでたくBooksクラスのオブジェクトは、InstanceMethodsモジュールのメソッドを使えるようになりました。