方法定义的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_evalclass_eval可能会也可能不会改变它。