有人能解释一下下列行为吗
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
我理解proc(块是什么)应该在它们被调用的范围内返回。(与lambdas不同)考虑到这一点,测试中的两个调用不都应该返回“块结束”吗?
这个测试通过了“ruby 1.8.7(2009-06-12 patchlevel 174)[universal-darwin10.0]”(osx 10.6.7)
最佳答案
return关键字从词汇封闭方法返回。即,*test_iterate*。
要以动态范围的方式从块返回特定值,应改用break关键字。
就你而言:
iterate { break("end of block") }
测试将失败。因为迭代方法的第二个返回语句永远不会运行。
预期的语义应该通过使用异常来实现:
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
关于ruby - ruby 区块中“return”关键字的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5733294/