定义方法的Ruby钩子?

时间:2018-01-20 02:33:56

标签: ruby

我一直在谷歌搜索这个并且找不到答案,这让我觉得答案是否定的,但我想我会问这里,万一有人确切知道。

Ruby是否有定义方法的钩子(即在模块或类上)?

如果没有,是否有人熟悉main对象的实现,知道在最高级别定义方法时如何将方法复制到Object

对此非常好奇。感谢您提供的任何信息:)

2 个答案:

答案 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_evalclass_eval可能或者可能不会改变它。