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モジュールのところを追加しました。