使用Ruby我想评估数组中的所有项,如果它们都通过了条件测试,则返回true.
我可以使用例如 array.all? { |value| value == 2 }
所以:
> array=[2,2]
> array.all? { |value| value == 2 }
=> true
> array=[2,3]
> array.all? { |value| value == 2 }
=> false
Run Code Online (Sandbox Code Playgroud)
大!
但是,为什么一个空数组通过了这个测试呢?
> array=[]
> array.all? { |value| value == 2 }
=> true
Run Code Online (Sandbox Code Playgroud)
这不应该是假的吗?
如果我需要它返回false,我应该如何修改方法?
Ami*_*pta 27
这是一个空洞的事实.它是通用量化的标准解释,即a
collection.all? { |x| some_predicate(x) }
Run Code Online (Sandbox Code Playgroud)
collection虽然空洞,但众所周知,当他们第一次在正式场合看到它时,会让人们反直觉.考虑为什么这是首选语义的一个好方法是考虑如何实现all?.
要使测试要求数组非空,只需这样做
array.any? && array.all? { |x| x == 2 }
Run Code Online (Sandbox Code Playgroud)
请注意,array.any?无论阵列有多大,都很快,但速度array.all? { |x| x == 2 }可能很慢,具体取决于它的大小array和稀有2程度.所以放第array.any?一个.
还要注意,有一些退化的情况,这将无法工作,例如,如果array是[nil]或[false].如果这样的情况可能会出现,请替换array.any?为array.any? { true }.
在Ruby中,你永远不能遍历空集合(数组,散列等),所以在你的情况下你的块永远不会被执行.如果块永远不会被执行,则all?返回true(没有条件使结果为false).
阅读all?中的Ruby文档.
你可以简单地实现你的目标
!array.empty? && array.all? { |value| value == 2 }
Run Code Online (Sandbox Code Playgroud)
文档说:" 如果块永远不会返回false或nil,则该方法返回true. "在空数组的情况下,块永远不会执行,因此该方法将始终返回true.就回归false而言,你必须这样做arr.empty?
| 归档时间: |
|
| 查看次数: |
4979 次 |
| 最近记录: |