3
這是嚴格的理論。模塊的instance_method是否可以被調用?
module BleeTest
def meth
puts 'foo'
end
end
此代碼無誤地運行,但是否有可能調用方法「meth」?
在我看來,「meth」是一個模塊的實例方法,無法實例化。但那爲什麼這個結構允許翻譯?
這是嚴格的理論。模塊的instance_method是否可以被調用?
module BleeTest
def meth
puts 'foo'
end
end
此代碼無誤地運行,但是否有可能調用方法「meth」?
在我看來,「meth」是一個模塊的實例方法,無法實例化。但那爲什麼這個結構允許翻譯?
是的,當然。你可以混合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中的文件:用作混合文件來組成對象和類。
不幸的是,你只能將該方法'綁定到'BleeTest'子類的一個實例上。 'm.bind(o).call#=> TypeError:綁定參數必須是BleeTest'的一個實例。所以這樣做工作正常:'o.extend(BleeTest); m.bind(o).call#=> foo' – horseyguy 2010-08-11 02:09:24
謝謝,這有助於澄清我正在閱讀的一些寶石源代碼。 – user258980 2010-08-11 03:14:33
@banister:你是對的。通過我的IRB歷史記錄,我在測試上述代碼時出現了複製和粘貼錯誤:不知何故,一個流浪的'包括BleeTest'結束了我的剪貼板。在頂層將'Foo'包括到'Object'中,這就是爲什麼當我測試它時它工作的原因。這表明:總是在全新的環境下進行測試! – 2010-08-11 10:12:28