从块中访问对象,该块在不同范围内定义

时间:2012-08-28 16:53:27

标签: ruby metaprogramming

有没有办法从不同范围内定义的块访问对象?对不起,如果它令人困惑,我举一个例子:

def scope(&block)
  foo = "bar"
  instance_eval &block
end

scope do
  puts "foo is #{foo}"
end

我想获得输出:

"foo is bar"

有可能吗?

1 个答案:

答案 0 :(得分:2)

真正的问题是你要做的是什么,但你能得到的最接近的是:

def scope
  @foo = "bar"
  yield
end

scope do
  puts "foo is #{@foo}"
end

请注意使用实例变量@foo而不是局部变量。除非您明确这样做,否则无法访问实例变量,如下所示:

def scope
  foo = "bar"
  yield foo
end

scope do |foo|
  puts "foo is #{foo}"
end

但这很好。否则,很难避免与本地变量发生冲突。

注意:我还使用隐式&block替换了对显式yield的使用。 yield表单需要一个块,并且语法更简单,但它主要是样式问题。