有人可以解释以下
的行为def iterate
return yield
return "end of iterate"
end
def test_iterate
assert_equal( "end of iterate", iterate { return "end of block" } )
assert_equal( "end of block", iterate { "end of block" } )
end
我理解Procs(这是什么块)应该在它们被调用的范围内返回。 (与lambdas不同)考虑到这一点,测试中的两个调用都不应该返回“块结束”吗?
此测试传递'ruby 1.8.7(2009-06-12 patchlevel 174)[universal-darwin10.0]'(OSX 10.6.7)
答案 0 :(得分:4)
return 关键字从lexicaly封闭方法返回。也就是说,* test_iterate *。
要以动态范围的方式从块中返回某个值,您应该使用 break 关键字。
在你的情况下:
iterate { break("end of block") }
测试将失败。因为iterate方法的第二个return语句永远不会运行。
预期的语义应该通过使用例外来完成:
def iterate
return yield
rescue :exception
return "end of iterate"
end
def test_iterate
assert_equal( "end of iterate", iterate { raise :exception } )
assert_equal( "end of block", iterate { "end of block" } )
end