在这两个测试一些代码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
Run Code Online (Sandbox Code Playgroud)
在[2]和[3]我看到似乎有短路评估,尽快中止迭代,但这是保证行为?阅读文档没有提到这种行为.我意识到我可以使用inject,因为它将迭代所有内容,但我有兴趣找出官方Ruby视图是什么.
该any?方法只是实现了“或”逻辑功能Enumerable。它可以被解释为声明:
y = x1 v x2 v x3 v ... v xn
该all?方法实现了“与”的逻辑功能Enumerable。它也可以被解释为声明:
y = x1 * x2 * x3 * ... * xn
由于Array是Enumerable,因此它也包含这些方法。因此,对于该方法,any?第一次出现true(既不是nil也不是false)结果会破坏true结果的枚举。在示例中,yield在数字4上变为true,因此这些方法会中断返回的执行:true
[1,2,3,4,5].any? {| x | puts x ; x > 3 }
# 1
# 2
# 3
# 4
# => true
Run Code Online (Sandbox Code Playgroud)
您还可以将DeMorgan 规则应用于function any?,并使用all?method :
![1,2,3,4,5].all? {| x | puts x ; x <= 3 }
# 1
# 2
# 3
# 4
# => true
Run Code Online (Sandbox Code Playgroud)
对于该方法,all?第一次出现的false或nil结果会执行类似的操作,即返回false。在示例中,yield在数字3上变为false,因此这些方法会中断返回的执行:false
[1,2,3,4,5].all? {| x | puts x ; x < 3 }
# 1
# 2
# 3
# => false
Run Code Online (Sandbox Code Playgroud)
并用DeMorgan 的变换来使用any?方法:
![1,2,3,4,5].any? {| x | puts x ; x >= 3 }
# 1
# 2
# 3
# => false
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1527 次 |
| 最近记录: |