3

有人可以解释以下行为

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)

4

1 回答 1

4

return关键字从词法封闭方法返回。也就是说,*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
于 2011-04-23T10:31:20.380 回答