2013-03-15 97 views
16

我正在研究「Metaprogramming 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'也是一個實例,我的英文不好=( – 2013-03-15 13:15:21

回答

14

AClass一個實例,並且可以看到,通過A.class

的類A的實例的是A,並訪問經由a = A.new; a.class

方法ancestors被表示這個類的對象具有(或將要)作爲它的繼承。

有兩種平行類層次結構模型在你的榜樣怎麼回事,他們只相互撲來因爲Ruby表示它的類爲您檢查和修改對象。

沒有根本的理由需要A.class.ancestors和A.ancestors完全相交 - 除了Ruby還有一個簡單的根的深層類模型,所以在實踐中,你會看到。

其實我找不到任何反例,甚至爲零做到這一點:

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

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

這一個是更具啓發性,但:

BasicObject.ancestors 
=> [BasicObject] 

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