Al escribir algunos rspec hoy, me encontré con un comportamiento inesperado al comparar las instancias de fecha (y tiempo) en nil. He aquí una muestra usando rubí en bruto (sin rieles u otras bibliotecas):En Ruby, ¿por qué una igualdad con nil ("Date.new == nil") devuelve nil?
[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
Hasta ahora, todo va bien, ¿verdad?
>> Date.new == nil
=> nil
>> Time.new == nil
=> nil
Fecha hace poner en práctica su propia ===, que funciona bien:
>> Date.new === nil
=> false
¿Hay alguna explicación de por qué sucede esto o por qué se desea esto comportamiento? == parece implementarse desde Comparable. ==, sin embargo, la documentación sobre eso no da ninguna indicación de que alguna vez devolvería nulo. ¿Cuál es la decisión de diseño para esto?
¡Actualización! Este no es el caso en 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
Fwiw, 1.8.7 (y eventualmente de antes) plantea ArgumentError en el ejemplo de comparación que diste: >> 5 < "la" ArgumentError: comparación de Fixnum con la cadena no \t a partir de (IRB): 41: en '<' \t desde (irb): 41 Sin embargo, su explicación sí tiene sentido, y parece que la Fecha # <=> nunca se actualizó (¿a propósito ?, quién sabe!) Para aumentar en lugar de devolver nada. Supongo que mi carne de res principal ahora es con los (muy generalmente) escuetos documentos de Ruby que no mencionan este comportamiento: * http://ruby-doc.org/core/classes/Date.html#M000673 * http://ruby-doc.org/core/classes/Comparable.html (no se menciona "nil" en la página) –
Vine aquí porque estoy trabajando en [Ruby Koans] (http: // rubykoans. com /), que incluyen la pregunta "¿Es mejor usar obj.nil? u obj == nil # ¿Por qué?" Espero que haya una respuesta mejor que "nil? Is better porque es menos problemático". –