其他人已告訴你的子類。但是,爲了回答你的問題的文字,我們會捲入與UnboundMethod
對象:
class Object
def kokot; 'kokot' end
end
o = Object.new
o.kokot
#=> kokot
3.kokot
#=> kokot
到目前爲止好。現在,讓我們重新定義kokot
方法上Numeric
:
class Numeric
def kokot; 'pica' end
end
o.kokot
#=> kokot
3.kokot
#=> pica
但如果我們決定,新kokot
方法是偉大的數字,但只是複數應繼續使用舊kokot
方法。我們可以這樣做:
um = Object.instance_method :kokot
#=> #<UnboundMethod: Object#kokot>
Complex(2, 3).kokot # gives the redefined kokot method
#=> pica
Complex.module_exec { define_method :kokot, um }
# Now we've just bound the old kokot to Complex
Complex(2, 3).kokot
#=> kokot
總之,有一種方法可以在相關類中「複製和粘貼」方法。要求目標是未綁定方法源的子類。方法#source_location
顯示該文件,並在那裏#kokot
已經定義行:
um.source_location
#=> ["(irb)", 2]
對於內置的方法,#source_location
返回nil
。在Ruby 2.0,RubyVM
類有方法#disassemble
:
RubyVM::InstructionSequence.disassemble(um)
#=> (program listing goes here)
在任何情況下,Ruby的字節碼是不是看起來很美。回到您的原始需求,甚至不是#define_method
或UnboundMethod#bind
都可以將方法綁定到不兼容的對象。這不能用的技巧,比如重新定義#kind_of?
被騙了,一會要騙CLASS_OF在本機代碼()函數...
從可用的寶石,Sourcify,RubyParser和Sorcerer感興趣。 (謝謝,@Casper。)使用這些,理論上可以通過#eval
-ling提取的方法源在不兼容的對象之間移植代碼。很長的路要走,這種技術仍然不能實現可靠的方法轉移,因爲只要源在運行時不可用(例如,自修改源),它就會失敗。
你爲什麼要這樣做?任何你不能使用混合模塊/模塊來完成這個任務的原因? –
@John:我不認爲OP是一個不理解子類概念的noob。你爲什麼不從字面上理解他的問題? –
您的代碼與您的標題相矛盾。你希望ClassA和ClassB(不是它的一個實例)共享相同的方法。 John Naegle的回答是正確的:將ClassA的所有實例方法移動到一個模塊中,然後將這個模塊包含到這兩個類中。 – BernardK