gpt4 book ai didi

ruby - 是否可以在方法中访问 block 的范围?

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

我想编写方法 (define_variables),它可以获取一个 block 并使用其中定义的变量。是否可以?例如,我想在输出中得到 5:

module A
def self.define_variables
yield
puts a # not 5 :(
end
end

A::define_variables do
a = 5
end

也许eval有一些技巧,但还没有找到任何人。

最佳答案

简而言之,没有。在您调用 yield 之后, block 中定义的那些变量消失了(就像我们将要看到的那样),除了返回的内容——范围就是这样工作的。在您的示例中,5 仍然存在,因为它由 block 返回,因此 puts yield 将打印 5。使用它,您可以从 block {:a => 5} 返回一个散列,然后以这种方式访问​​多个“变量”。在 Ruby 1.8 中(在 IRb only 中)您可以:

eval "a = 5"
a # => 5

虽然我不知道eval block 的内容。不管怎样,in Ruby 1.9 the scope of eval was isolated这会给你一个NameError。您可以在 Binding 的上下文中执行 eval虽然:

def foo
b = yield
eval(a, b) + 2
end

foo do
a = 5
binding
end # => 7

在我看来,您正在尝试做的是在 Ruby 中模拟宏,这是不可能的 (at least not pure Ruby),我不鼓励使用我上面提到的任何“解决方法”。

关于ruby - 是否可以在方法中访问 block 的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9245947/

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