RubyのModuleクラスはすべてのモジュールの母であり同時にすべてのクラスの父である!
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