其他人已告诉你的子类。但是,为了回答你的问题的文字,我们会卷入与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