我一直在谷歌搜索这个并且找不到答案,这让我觉得答案是否定的,但我想我会问这里,万一有人确切知道。
Ruby是否有定义方法的钩子(即在模块或类上)?
如果没有,是否有人熟悉main
对象的实现,知道在最高级别定义方法时如何将方法复制到Object
?
对此非常好奇。感谢您提供的任何信息:)
答案 0 :(得分:7)
确实如此。 Module#method_added
https://ruby-doc.org/core-2.2.2/Module.html#method-i-method_added
module Thing
def self.method_added(method_name)
puts "Thing added #{method_name}"
end
def self.a_class_method; end
def do_something; end
end
class Person
def self.method_added(method_name)
puts "I added #{method_name}"
end
attr_accessor :name
end
Thing
Person.new
# Thing added do_something
# I added name
# I added name=
答案 1 :(得分:0)
如果没有,是否有人熟悉
main
对象的实现,知道在最高级别定义方法时如何将方法复制到Object
?
它不是“复制方法”。语言规范只是说在顶层定义的方法成为Object
的方法。这与class Foo
中定义的方法成为class Foo
方法的机制完全相同。语言规范说它,因此实现者以这种方式实现它。 main
不需要做任何事情。
如果你想获得真正的技术,那么这就是the default definee,这是当你没有明确指定definee时定义方法的隐式范围(如def foo.bar; end
)。 通常,默认的definee是最近的词法封闭类或模块定义主体的self
,当没有词汇封闭的类或模块定义时,它是Object
。但是一些反思方法,例如instance_eval
或class_eval
等可能或者可能不会改变它。