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つの顔を持った実体だったんだ!