При написании некоторого rspec сегодня я столкнулся с неожиданным поведением при сравнении экземпляров Date (и Time) с nil. Здесь образец с использованием raw ruby (без Rails или других библиотек):
[email protected] ~ $ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]
[email protected] ~ $ 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.new === nil
=> false
Есть ли какие-либо объяснения, почему это происходит или почему это желаемое поведение? == похоже, реализовано из Comparable. ==, однако документация по этому поводу не дает никаких указаний на то, что она когда-либо вернет нуль. Какое конструктивное решение для этого?
Update! Это не относится к 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