有没有办法从不同范围内定义的块访问对象?对不起,如果它令人困惑,我举一个例子:
def scope(&block)
foo = "bar"
instance_eval &block
end
scope do
puts "foo is #{foo}"
end
我想获得输出:
"foo is bar"
有可能吗?
答案 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
表单需要一个块,并且语法更简单,但它主要是样式问题。