ruby块中'return'关键字的行为

时间:2011-04-20 16:04:33

标签: ruby lambda yield proc-object

有人可以解释以下

的行为
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)

1 个答案:

答案 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