首先,block.call()
是用yield
完成的,你不需要这样的&block
参数。
你不能正常地做你想做的事情,块被创建时被绑定,块内你可以看到当时定义的局部变量;最简单的方法做你想要的,这是不是你将如何正常使用块,是这样的:
def test()
foo = yield if block_given?
puts "in test, foo is #{foo}"
end
test() {
foo="this is foo"
}
但是,这只是一个副作用,因为foo
是“返回”的块。如果你这样做:
def test()
foo = yield if block_given?
puts "in test, foo is #{foo}"
end
test() {
foo="this is foo"
"ha ha, no foo for you"
}
你会注意到它做了一些不同的事情。
这里有更神奇的:
def test(&block)
foo = eval "foo", block.binding
puts foo
block.call
foo = eval "foo", block.binding
puts foo
end
foo = "before test"
test() {
foo = "after test"
"ha ha, no foo for you"
}
那倒样的工作,但如果你删除foo = "before test"
因为foo
成为一个局部变量在块和绑定不存在它打破。
摘要:您不能从块中访问局部变量,只能访问块定义的本地变量和块的返回值。
即使这是行不通的:
def test(&block)
eval "foo = 'go fish'", block.binding
block.call
bar = eval "foo", block.binding
puts bar
end
因为在结合foo
是从块的局部不同的(我不知道这件事,谢谢)。
这是误导,你没有访问块中的当地人,因为问题说,只是块的返回值。 – 2009-01-07 23:30:12