Ruby 中的猴子修补实例方法时注入外部作用域

Inject outer scope when monkey-patching instance method in Ruby

我有一个容器 class Foo 和一个方法 frob,我想添加一个类似命名的方法,它将委托给容器,每个包含元素。

第一次尝试

  self.children.each do |c|
    def c.frob
      self.frob
    end
  end

但这当然会导致 SystemStackError: stack level too deep,因为此时 selfc。然后我尝试了

  parent = self
  self.children.each do |c|
    def c.frob
      parent.frob
    end
  end

但是局部变量不是新定义方法的闭包的一部分,所以我得到 undefined local variable or method 'parent'.

我想出了以下有效的技巧:

  self.children.each do |c|
    c.instance_variable_set('@parent', self)
    def c.frob
      @parent.frob
    end
  end

但是,它会用这种方法只需要的东西污染子变量 space。如何在保持新定义的方法独立的同时获得 parent/self

这应该有效:

children.each do |c|
  parent = self
  c.send(:define_method, :frob) do
    parent.frob
  end
end