2012-11-24 94 views
-2

在完成元編程Ruby中的「對象模型」一章後,我感到困惑。 對象(某個類的實例)的方法與Ruby中它的類的實例方法是否相同? 聽起來不錯。因爲我們知道存儲在其類中的對象的方法。是一個對象(某個類的實例)的方法與Ruby中它的類的實例方法相同嗎?

class W;end 

W.methods == Class.instance_methods # => true 

# Also 

String.instance_methods == "abc".methods # => true 

WClass一個實例。但如果我重新打開W併爲它定義一個新的方法,比混淆。

class W 
    def self.foo 
    "bar" 
    end 
end 

W.methods == Class.instance_methods # => false 

WClass一個實例,並W的方法是Class的實例方法。但是如果:foo未存儲在Class中,那麼它比存儲在哪裏?

回答

0

方法wtf存儲在W類中,而不存儲在Ruby的Class類中。

把它看作是繼承,當你在繼承類中定義一個方法時,它在繼承類中是不可用的。同樣,當您在W類中定義方法時,它在Class類中不可用。 在繼承類中添加方法時,不會影響繼承的類。

雖然我不建議使用Ruby的內部Class類搞亂,你可以通過猴子修補它添加方法是:

class Class 
    def self.wtf 
    "wtf" 
    end 
end 

現在Class.methods.grep /wtf/將返回添加的方法。

+0

-1。這是錯誤的。 'wtf'不存儲在'W'類中,它存儲在'W'類對象的單例類中。 –

+0

我想我誤解了對象和類,現在我得到這個,'W'是_Class_的對象,'Class'也是_Class_的對象。他們是不同的對象。他們有相同的方法,因爲他們是_Class_的對象,如果我向W添加一個方法,它會像@JörgWMittag所說的那樣添加到W類對象的單例類。而這種類型的方法是單例方法。我剛剛發現,在ruby中我們可以定義一個像'def obj.method; end'這樣的方法。 – DouO

相關問題