Moduleクラスはすべてのモジュールの生成クラスである。だからModuleクラスに定義されたinstanceメソッドmは、すべてのモジュールで定義されたモジュールメソッドself.mになる。

class Module
    def m
      'm'
    end
  end
  Module.new.m # => "m"
  Kernel.m # => "m"
  Enumerable.m # => "m"
  Math.m # => "m"

またModuleクラスはClassクラスのスーパークラスでもある。だからModuleクラスに定義されたinstanceメソッドmは、Classクラスで定義されたinstanceメソッドmになる。

Class.new.m # => "m"

ここで、Classクラスはすべてのクラスの生成クラスである。だからClassクラスのinstanceメソッドとなったmは、すべてのクラスのクラスメソッドself.mになる。

Object.m # => "m"
  Array.m # => "m"
  class MyClass
  end
  MyClass.m # => "m"

この中には当然Moduleクラスも含まれているから、Classクラスのinstanceメソッドmは、Moduleクラスのクラスメソッドself.mにもなる。

Module.m # => "m"

ところが、ModuleクラスはClassクラスのスーパークラスだから、Moduleクラスのクラスメソッドになったself.mは、Classクラスのクラスメソッドself.mにもなる。

Class.m # => "m"

整理しよう。

Moduleクラスが1つのinstanceメソッドmを持つと、それがすべてのモジュールのモジュールメソッドself.mとなり、Classクラスのinstanceメソッドmとなり、ModuleクラスおよびClassクラスを含む、すべてのクラスのクラスメソッドself.mとなる。

Moduleクラスはモジュールの生成クラスである。だから、Classクラスがすべてのクラスを生み出すように、Moduleクラスはすべてのモジュールを生み出す。そして生み出されたすべてのモジュールは、Moduleクラスの特性に依存する。

そう、Classクラスがすべてのクラスの母であるなら…

Moduleクラスはすべてのモジュールの母だ!

加えてModuleクラスはClassクラスのスーパークラスである。だからModuleクラスに定義されたすべてのメソッドはClassクラスで使える。すべてのクラスはその生成クラスであるClassクラスの影響を受けるので、結果すべてのクラスはModuleクラスの影響を受けることになる。つまり、ModuleクラスはClassクラスによるクラス生成において、それを支援する極めて重要な役割を担っている。

要するにModuleクラスは、すべてのクラスの母であるClassクラスを支える…

すべてのクラスの父なんだ!

そうModuleクラスは、一方で各モジュールの母として彼らを生み出し、他方で各クラスの父としてClassクラスを支えるという、父と母の2つの顔を持った実体だったんだ!

関連記事:RubyのObjectクラスは過去を再定義するタイムマシンだ!



blog comments powered by Disqus
ruby_pack8

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