Rubyの継承・生成関係を整理する。

まずは「メタプログラミングRuby」のクイズから

Objectのクラスは何?

Object自体がクラスであり、そしてクラス自体もClassクラスのインスタンスとして生成された。よってObjectクラスのクラスは「Classクラス」

Moduleのスーパークラスは何?

Moduleも「module XXX」を作るためのクラスである。一方Moduleクラス自体も継承元があり、これが「Karnel」クラスである。

正: ClassはModuleクラスを継承したものである。ClassとModuleは「スコープを生成する」という同じような目的のために存在する。MoudleもClassやStringと同様に「Objectクラス」を引き継いでいる。

irb(main):001:0> String.ancestors
=> [String, Comparable, Object, Kernel, BasicObject]
irb(main):002:0> Module.ancestors
=> [Module, Object, Kernel, BasicObject]
irb(main):003:0> Class.ancestors
=> [Class, Module, Object, Kernel, BasicObject]

Classのクラスは何?

Classクラスも「Classクラス」のインスタンスとして生成されている。Classクラスはインスタンス化されて個別に任意で定義されるクラスとなり、インスタンスの設計図となる。Classクラス自体に設計図はない。自分自身が設計図になっている。そしてこの「Classクラス」自体はModuleを継承しており、ほとんど同じような性質を備えている。

ここまでの理解を自分で図にしてみた。

f:id:Pyons:20191004163441j:plain

Rubyの継承関係を把握するにあたり、抑えるべきことは以下の2点。

  • Classクラス、Moduleクラス、Objectクラスはすべて「Classクラス」がインスタンス化(実態化)された存在である。
  • 「MyClassクラス」「Stringクラス」「Classクラス」「Moduleクラス」すべて、「Objectクラス」から継承されている。

よって、ModuleクラスやObjectクラスに関していえば「自分を継承しているもの(Classクラス)は、自分を実体化したもの(Classクラス)」という奇妙な状態が発生する。

また「Stringクラス」などは、文字列を生成する設計図としての働きがある以上、設計図の設計図である「Classクラス」の実体化である。 一方文字列もまた、オブジェクトであり、中身を書き換えたり、Rubyにできるあらゆる動作を可能にしている。これは「Objectクラス」を継承しているからである。