2012-01-14 84 views
0

例如,我們有:爲什麼這個方法沒有被覆蓋?

module X 
def test 
    "X" 
end 
end 

module Y 
def test 
    "Y" 
end 
end 

class L 
include X 
end 

L.new.test #=> "X" 

class L 
include Y 
end 

L.new.test #=> "Y" 

class L 
include X 
end 

L.new.test #=> "Y" 

下面是奇怪的事情。爲什麼最後的包含沒有將方法更改爲X的方法?

回答

2

Ruby不允許包含一個模塊兩次,嘗試第二次執行它只是被忽略。

從它在幕後使用Module#includeModule#append_features文檔:

Ruby的默認實現添加常數,方法和模塊該模塊的變量國防部,如果該模塊尚未添加mod或其祖先之一。

+0

但爲什麼它會調用時,模塊包括在課堂上「包括」模塊回調每一次? – megas 2012-01-14 04:57:39

+0

看看'Module#include'源代碼。它首先調用'append_features',然後,不管模塊是否真的包含它,都調用'included'鉤子。 – 2012-01-14 05:03:39

相關問題