有人能解释一下下列行为吗

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/

10-10 07:15