我想编写方法(define_variables),它可以获得block并使用其中定义的变量.可能吗?例如,我想输出5:
module A
def self.define_variables
yield
puts a # not 5 :(
end
end
A::define_variables do
a = 5
end
Run Code Online (Sandbox Code Playgroud)
也许有一些eval的技巧,但还没有找到任何人.
简而言之,没有.你打过电话后,yield该块定义的那些变量是走了(的排序,我们将会看到),除了被返回,什么只是范围是如何工作的.在你的例子中,5仍然存在,它由块返回,因此puts yield将打印5.使用此方法,您可以从块返回一个哈希值{:a => 5},然后以这种方式访问多个"变量".在Ruby 1.8(在IRB 只),你可以这样做:
eval "a = 5"
a # => 5
Run Code Online (Sandbox Code Playgroud)
虽然我不知道eval一个块的内容.无论如何,在Ruby 1.9中,范围eval是孤立的,这将给你一个NameError.您可以eval在a的上下文中执行Binding:
def foo
b = yield
eval(a, b) + 2
end
foo do
a = 5
binding
end # => 7
Run Code Online (Sandbox Code Playgroud)
在我看来,你想要做的是在Ruby中模拟宏,这是不可能的(至少不是纯Ruby),并且我不鼓励使用我上面提到的任何"解决方法".