今日いくつかの rspec を書いているときに、Date (および Time) インスタンスを nil と比較すると、予期しない動作に遭遇しました。これは、生のルビーを使用したサンプルです (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