2010-08-10 29 views
3

這是嚴格的理論。模塊的instance_method是否可以被調用?

module BleeTest 
    def meth 
    puts 'foo' 
    end 
end 

此代碼無誤地運行,但是否有可能調用方法「meth」?

在我看來,「meth」是一個模塊的實例方法,無法實例化。但那爲什麼這個結構允許翻譯?

回答

8

是的,當然。你可以混合BleeTest到一個對象:

o = Object.new 
o.extend BleeTest 

o.meth 
# foo 

或者你可以混合BleeTest成一個類:

class C 
    include BleeTest 
end 

o = C.new 

o.meth 
# foo 

事實上,第一種形式,也可以在第二形式來表示:

o = Object.new 

class << o 
    include BleeTest 
end 

o.meth 
# foo 

,畢竟,MODU的整點 Ruby中的文件:用作混合文件來組成對象和類。

+0

不幸的是,你只能將該方法'綁定到'BleeTest'子類的一個實例上。 'm.bind(o).call#=> TypeError:綁定參數必須是BleeTest'的一個實例。所以這樣做工作正常:'o.extend(BleeTest); m.bind(o).call#=> foo' – horseyguy 2010-08-11 02:09:24

+0

謝謝,這有助於澄清我正在閱讀的一些寶石源代碼。 – user258980 2010-08-11 03:14:33

+0

@banister:你是對的。通過我的IRB歷史記錄,我在測試上述代碼時出現了複製和粘貼錯誤:不知何故,一個流浪的'包括BleeTest'結束了我的剪貼板。在頂層將'Foo'包括到'Object'中,這就是爲什麼當我測試它時它工作的原因。這表明:總是在全新的環境下進行測試! – 2010-08-11 10:12:28

相關問題