【发布时间】:2015-05-26 23:50:21
【问题描述】:
我有一个容器类 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?
【问题讨论】:
标签: ruby closures metaprogramming