我正在为一个项目编写DSL,但是我遇到了一个涉及局部变量的问题,当我不希望局部变量渗入嵌套proc时。看来,无论我尝试什么,一旦将其设置为proc的绑定,就无法用另一个作用域中的值覆盖局部变量的值。
我要开始工作的示例:
class Obj
def foo
:foo
end
end
def run_proc(context, &block)
context.instance_exec(&block)
end
def run_example(context)
# This `foo` the local var that ends up in the binding of
# the proc on the next line that I can't seem to overwrite
foo = :bar
run_proc(context) { foo }
# ^ I want to be able to eval `foo` based on the passed context obj
end
obj = Obj.new
# I want all three of these calls to return `:foo`
obj.foo #=> :foo # works as expected
obj.instance_exec { foo } #=> :foo # works as expected
run_example(obj) #=> :bar # doesn't work, since the `run_example`
# method's local `foo` var takes precedence
# over the passed object's `foo` method
我进行了一些挖掘,发现了与我尝试过的方法类似的答案:Change the binding of a Proc in Ruby。我还研究了在proc绑定中取消定义局部变量的可能性,但是此答案声称这样做是不可能的:Undefine variable in Ruby。
所以我现在的问题是:我应该放弃尝试嵌套procs和/或找到没有本地var / method name冲突问题的解决方法,还是实际上有办法解决这个问题? / p>
答案 0 :(得分:2)
您可以显式使用self.foo
使用它会调用当前引用的对象自身的绑定,而不是在创建proc / block时关闭状态。