今天在编写一些 rspec 时,我遇到了一些将日期(和时间)实例与 nil 进行比较的意外行为。这是一个使用原始 ruby 的示例(没有 Rails 或其他库):
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
是否有任何解释为什么会发生这种情况或为什么这是所需的行为?== 似乎是从 Comparable.== 实现的,但是关于它的文档没有给出任何迹象表明它会返回 nil。对此的设计决定是什么?
更新!在 1.9.2 中情况并非如此:
$ irb
ruby-1.9.2-p136 :001 > require 'date'
=> true
ruby-1.9.2-p136 :002 > Date.new == nil
=> false
ruby-1.9.2-p136 :003 > Time.new == nil
=> false