首先,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