为什么没有“假”'等于' nil'?

时间:2017-11-15 23:45:55

标签: ruby

false不等于nil,例如:

false == nil # => false

同样适用于false0

false == 0 # => false

nil0得到的结果相同:

nil == 0 # => false

为什么Ruby会这样?

2 个答案:

答案 0 :(得分:5)

在Ruby中,niltrue比较时==唯一一次返回nil == nilnil

您可以在此处详细了解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)

无与错(平等)

尽管许多人对该语言不熟悉,但nilfalse是对象而不是语言关键字。考虑FalseClass,其中说:

  

全局值false是类FalseClass的唯一实例,表示布尔表达式中的逻辑假值。

同样,NilClass是:

  

[t]他是单身对象nil的类。

当您使用Comparable#==之类的方法来比较它们时,Ruby会在实例上调用太空船操作符<=>,因为这两个类都没有定义#==方法。因为nil和false不是相同的对象,并且因为它们都不会覆盖基本的相等运算符,所以表达式false == nil将始终为false。

同样,像0这样的整数既不是FalseClass也不是NilClass的实例。因此,false == 0nil == 0都是假的,因为两个实例的计算结果都不为零。

Truthy和Falsey(条件)

出于分支目的,falsenil在条件表达式中评估为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}