【发布时间】:2013-12-19 06:15:11
【问题描述】:
在pry 和irb 中测试一些代码,我得到以下结果:
[1] pry(main)> a = [1, 3, 5, 7, 0]
=> [1, 3, 5, 7, 0]
[2] pry(main)> a.any? {|obj| p obj; 3 / obj > 1}
1
=> true
[3] pry(main)> a.all? {|obj| p obj; 3 / obj > 1}
1
3
=> false
在[2] 和[3] 中,我看到似乎有短路评估会尽快中止迭代,但这是保证行为吗?阅读文档没有提到这种行为。我意识到我可以改用inject,因为它会遍历所有内容,但我有兴趣了解官方的 Ruby 视图是什么。
【问题讨论】:
-
garanteed是什么意思?在 [2] 中,它在找到任何一个时停止评估,即 > 然后 1。我看不出有什么理由让它更进一步。 [3] 也是如此,当它发现任何错误时它停止了。还有很多其他方法可以通过整句对象进行评估... -
我的意思是,由于数组中有一个零,如果我使用
inject,我会得到一个ZeroDivisionError,但会是一个符合标准的Ruby实现(假设有一个规范要符合!)总是在尽可能早的时候停止,从不尝试除以零? -
我相信甚至没有定义
any?或all?从头到尾遍历数组。为了保存跨 ruby 版本,您不能做出这样的假设。对于可能没问题的单个 ruby 版本。 -
我认为@tessi 提出了要点:没有要求任何返回 true 或 false 的方法以任何特定顺序遍历集合。
标签: ruby