Является ли это ошибкой в ​​классе времени Ruby при выполнении арифметики относительной даты?

Может ли кто-нибудь сказать мне, является ли это ошибкой в ​​рубиновом классе времени?

ruby-1.8.7-p334 :021 > now = Time.now
 => Mon Aug 29 03:32:25 -0700 2011 
ruby-1.8.7-p334 :022 > raise "This should not fail" if (now + 1.day != now + 1.day.to_i)
RuntimeError: This should not fail
    from (irb):22
ruby-1.8.7-p334 :023 > 

Как вы можете видеть, я получаю ошибку времени выполнения, и я не верю, что должен быть. Недавно я обновил гем active_support, который, по моему мнению, обеспечивает эту функциональность.

Спасибо.

** ОБНОВИТЬ **

И теперь это работает без каких-либо изменений, кроме того, что я ложусь спать, просыпаюсь и перезапускаю вещи. Это очень странно; Фрагмент, который я предоставил выше, был прямо вырезан и вставлен из моего окна терминала.... Я работал с 3.0.10 из activerecord/support/model/etc.

Спасибо всем за ваши мысли по этому поводу!


person esilver    schedule 29.08.2011    source источник
comment
Также сообщите нам, какую версию active_support вы используете.   -  person Andy Waite    schedule 29.08.2011
comment
Что вы require делаете перед этим кодом? Мне нужны active_record и active_support, но я не могу получить доступ к этому методу day.   -  person Sony Santos    schedule 29.08.2011


Ответы (2)


Хотя time.to_s его не включает, объект Time содержит миллисекунды, и не только это, он содержит доли секунды (с гораздо более высоким разрешением) (см.: Time#subsec).

Time.now == Time.now уже будет ложным, потому что для завершения каждого вызова now потребуется несколько тактов процессора. Также взгляните на Time#eql?.

Возвращает true, если time и other_time являются объектами Time с одинаковыми секундами и долями секунды.

person Marcel Jackwerth    schedule 29.08.2011
comment
В данном случае now является локальной переменной, поэтому now == now. Более того, я предполагаю, что 1.day - это целое число секунд. - person Sony Santos; 29.08.2011

Конечно, это не ошибка в классе Time, потому что разница, похоже, заключается в методе day класса Fixnum. Более того, это не метод исходного класса Fixnum; он должен быть определен в каком-то файле, который вы required ранее.

person Sony Santos    schedule 29.08.2011