0

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

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

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

我想得到输出:

"foo is bar"

是否可以?

4

1 回答 1

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表单需要一个块存在,并且语法更简单,但这主要是样式问题。

于 2012-08-28T17:03:24.867 回答