是否可以在方法中访问块的范围?

evf*_*qcg 2 ruby

我想编写方法(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的技巧,但还没有找到任何人.

And*_*all 5

简而言之,没有.你打过电话后,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),并且我不鼓励使用我上面提到的任何"解决方法".