我有一个容器类Foo
和一个方法frob
,我想添加一个类似的命名方法,它将委托给容器,每个包含的元素。
第一次尝试
self.children.each do |c|
def c.frob
self.frob
end
end
,但这当然导致SystemStackError: stack level too deep
,因为self
是c
在这一点。然后我尝试了
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