hp12c
30 September 2008

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クラスは過去を再定義するタイムマシンだ!



Please enable JavaScript to view the comments powered by Disqus. blog comments powered by Disqus
ruby_pack8

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


AltStyle によって変換されたページ (->オリジナル) /