基于 uncutstone 的侦查,define_method() 不会被 main 的单例类继承:
class <<self
p private_instance_methods(false)
end
--output:--
[:public, :private, :include, :using, :define_method]
...据我所知,如果一个方法没有被继承,它必须在类中定义。请注意,当您包含一个模块时,ruby 会创建一个匿名类并将模块的 defs 插入匿名类中,然后将匿名类直接插入方法查找链中包含类的上方,例如:
module A
def greet
puts 'hi'
end
end
class Dog
include A
end
p Dog.instance_methods(false)
p Dog.instance_methods.grep(/^g/)
--output:--
[]
[:greet]
输出显示 greet() 是一个继承方法。但是因为define_method() 没有被main 的单例类继承,所以define_method() 不能通过包含模块来获取。相反,define_method() 似乎必须在 main 的单例类中定义。因此,实现它的一种方法是让 ruby 解释器在解析代码之前执行以下代码:
class <<self
def define_method(x, *y)
#same code as in Module's define method
end
end