为什么[] .all?{| a | a.include?('_')}返回true?

时间:2010-11-02 05:34:24

标签: ruby logic boolean-logic

为什么

[].all?{|a| a.include?('_')} 

返回true

4 个答案:

答案 0 :(得分:10)

您的代码询问以下声明的真实性:“对于空列表中的所有元素aa包含字符'_'。”因为空列表中没有元素,所以该语句为true。 (这在逻辑中称为vacuous truth。)如果您试图找到一种方法使该表达式为假,则可能更容易理解。这需要在空列表中至少有一个元素 包含'_'。但是,空列表为空,因此不存在这样的元素。因此,该陈述不能有意义地为假,所以它必须是真的。

答案 1 :(得分:7)

all?会将数组的每个元素传递给块{|a| a.include?('_')},如果块没有返回truefalse,则返回nil任何元素。由于数组没有元素,因此该块永远不会返回falsenil,因此all?会返回true

答案 2 :(得分:2)

如果块永远不返回false或nil,则

all?返回true。该块永远不会被调用,因此它永远不会返回false或nil,因此all?返回true。

答案 3 :(得分:1)

即使

[].all?{ false }

返回true,原因在bcat的答案中解释。