9

为什么

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

返回true

4

4 回答 4

10

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

于 2010-11-02T05:40:03.340 回答
7

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

于 2010-11-02T05:37:38.503 回答
2

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

于 2010-11-02T05:38:17.230 回答
1

甚至

[].all?{ false }

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

于 2010-11-02T22:41:44.137 回答