gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:02:20 24 4
gpt4 key购买 nike

我正在为一个项目编写 DSL,我遇到了一个问题,涉及局部变量在我不希望的时候渗入嵌套过程。似乎无论我尝试什么,一旦局部变量的值被设置到 proc 的绑定(bind)中,我就无法用另一个范围的值覆盖它。

我正在尝试开始工作的示例:

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 的绑定(bind)中取消定义局部变量的可能性,但这个答案声称这样做是不可能的:Undefine variable in Ruby .

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

最佳答案

你可以明确地使用self.foo

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

关于ruby - 为什么 instance_exec 不覆盖 Proc 对象绑定(bind)中存在的局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57064525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com