読者です 読者をやめる 読者になる 読者になる

RubyのClassクラスについてとか、クラスを知るためのメソッドとか、あれこれ(メモ)

Ruby

MyClass.class            # => Class

MyClass.class.class   # => Class

という結果に Σ(・∀・;) となったので調べた。

 (.classはオブジェクトが定義されたクラス名を返す。)

 

まとめ

Rubyでは、定義されたクラスは全て、Classクラスのインスタンスとなる。

Rubyでは、扱われる全ての要素はオブジェクトで(何らかのクラスのインスタンスで)、Objectクラスのインスタンスメソッドを継承している。(Object#classとか)

どうやら、MyClass.classで返る"Class"も、クラスであり、オブジェクトであり、Classクラスのインスタンスとして扱われるため、その結果、MyClass.class.class #=> Class が返るらしい。(難しいなぁ。考え方合ってるのかなぁ。。)

 

やってみよう!

f:id:bambinya:20160110135338p:plain

StringやArrayなどの組み込みクラスも、自分で定義したMyClassも、.classを実行するとClassが返ってくる。

Rubyで扱う全ての値はオブジェクトなので、Objectクラスが持つインスタンスメソッドを継承している。あるクラスが持つインスタンスメソッドを見たいときは、instance_methodsを使う。(↓こんな感じ。)

f:id:bambinya:20160110142407p:plain

 

MyClass.classが返すのは、Classクラスというオブジェクトである。

f:id:bambinya:20160110150442p:plain

Classクラスは"クラス"の一つなので、オブジェクトであり、また、Classクラスのインスタンスであることから、MyClass.class.class #=> Class という結果になるみたい。

 

ちなみに、あるクラスがどんなクラスやモジュールを継承したりインクルードしているかを見るにはancestorsを使う。

出力結果の、配列の順番は、[クラス自身、親クラス、親の親クラス..]となる。クラス名の間にインクルードしているモジュール名がちょこちょこ入ってくる。

実行結果。

Rubyで扱う全ての値はオブジェクトなので、ClassクラスもObjectクラスを継承していることがわかる。)

f:id:bambinya:20160110145829p:plain

 

おしまい。m(__)m