false
不等于nil
,例如:
false == nil # => false
同样适用于false
和0
:
false == 0 # => false
nil
和0
得到的结果相同:
nil == 0 # => false
为什么Ruby会这样?
答案 0 :(得分:5)
在Ruby中,nil
在true
比较时==
唯一一次返回nil == nil
:nil
您可以在此处详细了解nil
:
https://ruby-doc.org/core-2.2.3/NilClass.html
undefined
相当于JavaScript中的None
或Python中的>> (undefined === false)
=> false
在JavaScript中考虑:
>> (None == False)
=> False
或Python:
public class horse
{
.
.
.
//took out a lot of code as it was not important to the problem
public String horseFeed(double w)
{
double sFeed= w*.015;
double eFeed= w*.013;
String range = sFeed + " < " + eFeed;
return range;
}
}
答案 1 :(得分:3)
尽管许多人对该语言不熟悉,但nil
和false
是对象而不是语言关键字。考虑FalseClass,其中说:
全局值
false
是类FalseClass
的唯一实例,表示布尔表达式中的逻辑假值。
同样,NilClass是:
[t]他是单身对象
nil
的类。
当您使用Comparable#==之类的方法来比较它们时,Ruby会在实例上调用太空船操作符<=>
,因为这两个类都没有定义#==
方法。因为nil和false不是相同的对象,并且因为它们都不会覆盖基本的相等运算符,所以表达式false == nil
将始终为false。
同样,像0
这样的整数既不是FalseClass也不是NilClass的实例。因此,false == 0
和nil == 0
都是假的,因为两个实例的计算结果都不为零。
出于分支目的,false
和nil
在条件表达式中评估为false。其他一切评价为真。
考虑以下非惯用的,人为的,但希望说明Ruby的基本真值表的例子:
def truth_table value
if value
true
else
false
end
end
truth_table nil
#=> false
truth_table false
#=> false
truth_table true
#=> true
truth_table 'a'
#=> true
truth_table 0
#=> true
truth_table 1
#=> true
在Ruby中,Nil和false在语义上是不同的,并且来自不同的基类。它们也不相等。但是,对于分支目的或在布尔上下文中,它们都可以被视为“不正确”。例如,请考虑以下习惯用于将结果转换为布尔值true或false值:
!(nil)
#=> true
!!(nil)
#=> false
您可以使用此惯用法将以前的真值表示例缩短为:
# Convert any value to a Boolean.
def truth_table value
!!value
end
# Test our truth table again in a more compact but less readable way.
table = {}
[nil, false, true, 'a', 0, 1].map { |v| table[v] = truth_table(v) }; table
#=> {nil=>false, false=>false, true=>true, "a"=>true, 0=>true, 1=>true}