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



我有一个容器类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

但是,它用一些只由这个方法需要的东西污染了子方法的变量空间。我怎么能得到parent/self在那里,同时保持新定义的方法自包含?

应该可以:

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

最新更新