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
,因为此时 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
但是,它会用这种方法只需要的东西污染子变量 space。如何在保持新定义的方法独立的同时获得 parent
/self
?
这应该有效:
children.each do |c|
parent = self
c.send(:define_method, :frob) do
parent.frob
end
end
我有一个容器 class 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
但是,它会用这种方法只需要的东西污染子变量 space。如何在保持新定义的方法独立的同时获得 parent
/self
?
这应该有效:
children.each do |c|
parent = self
c.send(:define_method, :frob) do
parent.frob
end
end