方法定义的Ruby钩子?
我一直在谷歌搜索这个并且找不到答案,这让我觉得答案是否定的,但我想我会在这里问以防万一有人确切知道。
Ruby是否有定义方法的钩子(即在模块或类上)?
如果没有,是否有人熟悉main
对象的实现,以了解在顶层定义方法时如何将方法复制到Object
?
真的好奇这个。 谢谢你的任何信息:)
确实如此。 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=
如果没有,是否有人熟悉
main
对象的实现,以了解在顶层定义方法时如何将方法复制到Object
?
它不是“复制方法”。 语言规范只是说在顶层定义的方法成为Object
方法。 这与在class Foo
定义的方法成为class Foo
方法的机制完全相同。 语言规范说它,因此实现者以这种方式实现它。 main
不需要做任何事情。
如果你想获得真正的技术,那么这是关于默认的definee ,它是在你没有明确指定definee时定义方法的隐式范围(如在def foo.bar; end
)。 通常 ,默认的definee是最近的词汇封闭类或模块定义主体的self
,当没有词法封闭的类或模块定义时,它是Object
。 但是一些reflection方法,例如instance_eval
或class_eval
等可能会也可能不会改变它。