2013-03-15 9 views
16

"Rubyのメタプログラミング"という本からRubyオブジェクトモデルを勉強していますが、クラスもオブジェクトであるという概念を理解しています。Rubyオブジェクトモデル - クラスの祖先

class A 
end 

A.ancestors # => [A, Object, Kernel, BasicObject] 
A.class.ancestors # => [Class, Module, Object, Kernel, BasicObject] 

私は私が最初にIRBにA.ancestorsをしようとしたとき、私は私がA.class.ancestorsで得た結果と予想ことである程度困惑している - 私の思考プロセスだったが、Aはクラスであるため、クラスはClassクラスのインスタンスですが、その祖先はClassです。しかしクラスはAの祖先ではないようです。

誰かが私の混乱を解消できますか?

+1

'A'は'クラスのインスタンスであります'、Rubyでは、' Class'もインスタンスです、私の英語は良くない=( –

答えて

14

クラスAClassのインスタンスであり、あなたはA.class

を経由してAのインスタンスのクラスがAであることがわかります、あなたはa = A.new; a.class

メソッドを介してancestorsが表示されていることへのアクセスそのクラスのオブジェクトが継承として持っている(または持っている)クラス階層を作成します。

Rubyはあなたが検査し、修正するためのオブジェクトとしてのクラスを表すので、2つの並列クラス階層モデルはあなたの例で起こって、お互いに彼らのみ衝突するがあります。

A.class.ancestorsとA.ancestorsがまったく交差する必要がある根本的な理由はありません - Rubyには単純な根を持つ深いクラスモデルがあることを除いて、実際にはあなたが見るでしょう。実際に

私はこれを行うにもnilを、任意の反例を見つけることができませんでした:

NilClass.ancestors 
=> [NilClass, Object, Kernel, BasicObject] 

NilClass.class.ancestors 
=> [Class, Module, Object, Kernel, BasicObject] 

この1はしかしもっと啓発です:

BasicObject.ancestors 
=> [BasicObject] 

BasicObject.class.ancestors 
=> [Class, Module, Object, Kernel, BasicObject] 
関連する問題