今天我在写一些rspec时,遇到了比较Date(和Time)实例与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