为什么.all?在空数组上返回true?

And*_*vey 22 ruby

使用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 }.

  • 是的,+ 1,这是核心团队在设计方法时推理的最正确解释.并且@sawa可以注意到,在这个答案所链接的维基文章中,对于什么时候真空陈述应该被视为"真正"真实,何时为特殊情况,并没有绝对的共识. (2认同)

Sac*_*ngh 8

在Ruby中,你永远不能遍历空集合(数组,散列等),所以在你的情况下你的块永远不会被执行.如果块永远不会被执行,则all?返回true(没有条件使结果为false).

阅读all?的Ruby文档.

你可以简单地实现你的目标

  !array.empty? && array.all? { |value| value == 2 }
Run Code Online (Sandbox Code Playgroud)


Ana*_*hah 5

文档说:" 如果块永远不会返回false或nil,则该方法返回true. "在空数组的情况下,块永远不会执行,因此该方法将始终返回true.就回归false而言,你必须这样做arr.empty?