在Ruby中,为什么等式返回nil?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

当今天编写一些rspec时,我发现一些意外,比较Date(和Time)实例为零。以下是使用原始ruby的示例:

user@MacBook-Work ~ $ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]
user@MacBook-Work ~ $ irb
>> 1 == nil
=> false
>> "string" == nil
=> false
>> :sym == nil
=> false
>> false == nil
=> false
>> [] == nil
=> false
>> {} == nil
=> false
>> Proc.new {} == nil
=> false

到目前为止,这么好,对吧?

>> Date.new == nil
=> nil
>> Time.new == nil
=> nil

Date确实实现了它自己的===,它工作正常:

>> Date.new === nil
=> false

提问于
用户回答回答于

我查看了源代码,这里是我发现的:

通过可比的所有定义的比较操作使用功能rb_cmpint一起<=>rb_cmpint当其中一个操作数为零时引发异常。

因此,如果rhs与lhs无法比较,那么Comparable就会引发异常。即5 < 2是假,但5 < "la"引发了一个例外。他们这样做是为了区分哪些情况<是不正确的,因为rhs较小,以及由于rhs不具有可比性而导致情况不正确。或者换句话说:什么时候x < y是假的,这意味着这x >= y是真的。所以在情况不是这样的情况下,它会抛出异常。

==引发异常会很糟糕,因为==通常不会(也不应该)要求其操作数具有可比性。但是==使用与其他操作数相同的方法,这会引发异常。所以整个功能简单地包装在一个rb_rescuenil如果抛出异常,它会返回。

用户回答回答于

如果你用这个代码,你总是可以使用.nil?

>> Date.new.nil?
=> false

扫码关注云+社区