RubyのObjectクラスは過去を再定義するタイムマシンだ!
Objectクラスはすべてのクラスのスーパークラスである
だからObjectクラスに定義されたinstanceメソッドoは
すべてのクラスで定義されたinstanceメソッドoになる
class Object def o 'o' end end class MyClass end Object.new.o # => "o" Array.new.o # => "o" Hash.new.o # => "o" MyClass.new.o # => "o"
ClassクラスもObjectクラスのサブクラスだから
このinstanceメソッドoは
当然Classクラスのinstanceメソッドoにもなる
Class.new.o # => "o"
一方Classクラスはすべてのクラスの生成クラスである
だからClassクラスのinstanceメソッドとなったoは
すべてのクラスのクラスメソッドself.oになる
Array.o # => "o" Hash.o # => "o" MyClass.o # => "o"
この中には当然Objectクラスが含まれているから
Classクラスのinstanceメソッドoは
Objectクラスのクラスメソッドself.oにもなる
Object.o # => "o"
ところがObjectクラスはClassクラスのスーパークラスだから
Objectクラスのクラスメソッドになったself.oは
Classクラスのクラスメソッドself.oにもなる
Class.o # => "o"
整理しよう
Objectクラスが1つのinstanceメソッドoを持つと
それがClassクラスを含むすべてのクラスのinstanceメソッドoとなり
Objectを含むすべてのクラスのクラスメソッドself.oとなり
Classクラスのクラスメソッドself.oとなる
こうしてRuby空間に存在するすべてのクラスには
instanceメソッドoとクラスメソッドself.oが生まれることとなる
ClassクラスはObjectクラスを含むすべてのクラスの母である
従ってすべてのクラスはClassクラスの特性に依存する
一方でClassクラスはその子であるObjectクラスの弟子である
従ってClassクラスはObjectクラスの特性を受け継ぐ
このような多層的循環構造によって
Objectクラスが変わると
Classクラスが変わり
その変化はすべてのクラスを変える
つまりObjectクラスへのオペレーションは
過去の事実(Classクラス)を再定義し
延いては今の世界(すべてのクラス)を再構築する!
そうRubyのObjectクラスは…
時空を超えて過去を再定義し
世界を再構築するタイムマシンだったんだ!
ところでObjectクラスにはKernelモジュールがincludeされている
モジュールに定義されたinstanceメソッドは
それをincludeしたクラスのものになるから
Kernelモジュールのinstanceメソッドは
Objectクラスのものになる
つまりKernelモジュールはObjectクラスに
過去を変えるためのメソッドを補給する
Kernelモジュールから補給されたメソッドは
Objectクラスに定義されたメソッドとして
同様に過去を再定義し今の世界を再構築する
そうRubyのKernelモジュールは…
タイムマシン補助燃料タンクだったんだ!
関連記事:Rubyのクラスはオブジェクトの母、モジュールはベビーシッター - hp12c
2008-9-29追記:Kernelモジュールのところを追加しました。