首先,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
绑定中的 与块中的本地不同(我不知道,谢谢)。