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のクラスはオブジェクトの母、モジュールはベビーシッター
(追記:2008-9-29)Kernelモジュールのところを追加しました。
blog comments powered by Disqus