为什么日期之间的减法返回Rational类型?

我想在日期上执行减法运算。

date_sent = Date.parse("2013-01-01") #=> Tue, 01 Jan 2013 date_now = Date.today #=> Wed, 04 Sep 2013 days = (date_now - date_sent) #=> (246/1) 

为什么date_now - date_sent返回Rational类型?

这是预期的行为。 来自文档 :

d – 其他→约会或理性

 Date.new(2001,2,3) - 1 #=> # Date.new(2001,2,3) - Date.new(2001) #=> (33/1) 

使用有理类型是因为它可以准确地表达差异:

 diff = DateTime.new(2001,2,3) - DateTime.new(2001,2,2,1) #=> (23/24) 

而浮动不能:

 diff.to_f #=> 0.9583333333333334 

因为您可能希望找到两个DateTime之间的差异,这可能是Rational 。 例如:

 DateTime.new(2001,2,3) - DateTime.new(2001,2,2,12) # ⇒ (1/2) 

这对我来说也很困惑。

天之间的差异总是一个整数,那么为什么要把它表达为理性呢?

那是因为它是用于表示Date和DateTime之间差异的相同返回类型,或两个DateTime。这样你可以表达两次之间的差异。

我个人不相信这是最好的选择,例如:

 Time.now.to_datetime-Date.today 

收益:

 => (44150896597/86400000000) 

它认为这更清楚:

 => 0.5110978639814815 

因为有时会发生如下的比较:

 date_sent = DateTime.parse("2013-01-01 12:00:00") # with half a day date_now = Date.today days = (date_now - date_sent) # => (491/2)