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
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS