为什么instance_exec不覆盖 Proc 对象的绑定中存在的局部变量?



我正在为一个项目编写DSL,我遇到了一个问题,涉及局部变量渗入嵌套进程,而我不希望它们这样做。似乎无论我尝试什么,一旦将局部变量设置为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

我做了一些挖掘,并找到了与我一直在尝试的类似方法的答案:更改 Ruby 中 Proc 的绑定。我还研究了在 proc 绑定中取消定义局部变量的可能性,但这个答案声称这样做是不可能的:Ruby 中的取消定义变量。

所以我现在的问题是:我应该放弃尝试嵌套进程和/或找到一种没有本地变量/方法名称冲突问题的解决方法,还是实际上有办法解决这个问题?

你可以显式使用self.foo

使用它调用对象自身当前引用的绑定,而不是创建 proc/block 时状态的闭包。

最新更新