2014-03-04 41 views
0
class Taco 
    # . . . 
end 

獲取祖先鏈:如何找到祖先鏈的任何方法?

Taco.ancestors 
#=> [Taco, Object, Kernel, BasicObject] 

說我想找到「父」類和它的祖先鏈紅寶石定義的方法。我會怎麼做呢?

E.g. method_missing.parent.ancestors

如果一切應該從BasicObject繼承爲什麼不Kernel

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

Kernel.ancestors 
#=> [Kernel] 

BasicObject.ancestors 
#=> [BasicObject] 

而且從ClassModule但爲什麼我Taco類祖先的鏈沒有從他們那裏繼承,而是繼承Class直接從Object着繼承?

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

回答

0

具體關於你的問題:「同樣來自ClassModuleClass繼承,但爲什麼我Taco類祖先的鏈沒有從他們那裏繼承,而是直接從Object着繼承」

Taco實例Class,但其Object。一個實例關係和一個超類關係是兩個完全不同的東西。

例如:假設您創建了一個Animal類別的子類DogAnimal.new會給你一個對象,它的實例AnimalDog類是而不是Animal的一個實例(它本身不是動物 - 而是它定義了一種動物)。其超類Animal

每個對象都是某個類的實例 - 請致電class來找出哪一個類。但並不是所有的對象都有一個超類 - 只有Class的實例。

此外,Class不會從Class繼承。那是不可能的。 所有類都出現在它們自己的ancestors的開頭,但這並不意味着它們自己繼承。這就是ancestors方法的工作原理。

6

您正在尋找owner

method(:puts).owner 
    #=> Kernel 
method(:puts).owner.ancestors 
    #=> [Kernel] 

返回到您的塔科例如:

class Taco 
    def self.eat 
    "YUM" 
    end 
end 

Taco.method(:eat).owner 
    #=> #<Class:Taco> 
Taco.method(:eat).owner.ancestors 
    #=> [Class, Module, Object, PP::ObjectMixin, Kernel, BasicObject] 

內核是module一個實例。檢查了這一點:

Kernel.class.ancestors 
    #=> [Module, Object, PP::ObjectMixin, Kernel, BasicObject] 

這裏是如果你有興趣的Ruby對象模型的一些further reading。此外,這裏是從谷歌圖像中盜取的圖像,可能有助於鞏固這些概念。

ruby object model

+0

嘿,這很酷。你能否就這個問題的其他部分闡述一些知識?非常感謝。 – fyz

+0

如果我做'Taco.method(:eat).owner.ancestors'我回來了'[Module,Object,Kernel,BasicObject]' – fyz

+0

我不知道當我把'def'當成'self'時, def「yum」end' – fyz

相關問題