为什么
[].all?{|a| a.include?('_')}
返回true
?
您的代码询问以下语句的真实性:“对于a
空列表中的所有元素,a
包括字符'_'
。” 因为空列表中没有元素,所以该陈述为真。(这在逻辑上被称为空洞的真理。)如果您尝试找到一种方法使该表达式为假,可能会更容易理解。这需要在空列表中至少有一个不包含'_'
. 但是,空列表是空的,因此不存在这样的元素。因此,该陈述不能有意义地为假,因此它必须为真。
all?
将数组的每个元素传递给 block {|a| a.include?('_')}
,true
如果 block 没有返回false
或nil
任何元素返回,则返回。由于数组没有元素,因此块永远不会返回false
ornil
等all?
返回true
。
all?
如果块从不返回 false 或 nil,则返回 true。该块永远不会被调用,因此它永远不会返回 false 或 nil,因此all?
返回 true。
甚至
[].all?{ false }
返回true
,原因在 bcat 的回答中解释。