【发布时间】:2017-03-15 19:18:03
【问题描述】:
我想覆盖 Ruby 的 Range 中的 .. 和 ... 运算符。
原因是,我正在使用数据库中的无限日期范围。如果你从 Postgres 中提取一个 infinty 日期时间,你会在 Ruby 中得到一个 Float::INFINITY。
问题是,我不能使用Float::INFINITY 作为范围的结尾:
Date.today...Float::INFINITY
=> Wed, 02 Nov 2016...Infinity
DateTime.now...Float::INFINITY
# ArgumentError: bad value for range
Time.now...Float::INFINITY
# ArgumentError: bad value for range
...但我在代码中经常使用.. 和... 语法。
为了能够构造范围,您需要改用DateTime::Infinity.new:
Date.today...DateTime::Infinity.new
=> Wed, 02 Nov 2016...#<Date::Infinity:0x007fd82348c698 @d=1>
DateTime.now...DateTime::Infinity.new
=> Wed, 02 Nov 2016 12:57:07 +0000...#<Date::Infinity:0x007fd82348c698 @d=1>
Time.now...DateTime::Infinity.new
=> 2016-11-02 12:57:33 +0000...#<Date::Infinity:0x007fd82348c698 @d=1>
但我每次都需要进行Float::INFINITY -> DateTime::Infinity.new 转换:
model.start_time...convert_infinity(model.end_time)
有没有一种方法可以覆盖 .. 和 ... 运算符,以便我可以合并转换函数并保留语法糖?
【问题讨论】:
-
我发现了这个:bugs.ruby-lang.org/issues/6864。不确定它是否已经解决。
-
您使用的是什么版本的 Rails?
DateTime.now...Float::INFINITY在 Rails 5.0.0.1 中运行良好。 -
哦,我用的是
4.2.5 -
@MuradYusufov:它甚至可以在没有导轨的情况下工作。在普通的 IRB 2.3.1 控制台中。
-
@SergioTulentsev 这是真的,是的,我刚开始忘了
require 'date'。这就引出了下一个问题:您使用的是什么版本的 Ruby?
标签: ruby-on-rails ruby postgresql ruby-on-rails-4.2