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