如何覆盖 Ruby 范围的 .. 和 ... 运算符以接受 Float::INFINITY?
How can I override the .. and ... operators of Ruby Ranges to accept Float::INFINITY?
我想覆盖 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)
有什么方法可以覆盖 ..
和 ...
运算符,以便我可以合并转换函数并保留语法糖?
我不认为你想做的是解决此类问题的正确方法。
我建议的是简单地覆盖模型中的 end_date
方法:
def end_date
super == Float::INFINITY ? DateTime::Infinity.new : super
end
这基本上是说如果 end_date
in db 是 Float::INFINITY
return DateTime::Infinity.new
as end_date
,否则 return 数据库中的内容。
Ruby 2.6引入了endless range,可以这样使用,例如:
(DateTime.now..)
(DateTime.now...)
这提供了一种回答这个问题的新方法。希望它对某人有用!
我想覆盖 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)
有什么方法可以覆盖 ..
和 ...
运算符,以便我可以合并转换函数并保留语法糖?
我不认为你想做的是解决此类问题的正确方法。
我建议的是简单地覆盖模型中的 end_date
方法:
def end_date
super == Float::INFINITY ? DateTime::Infinity.new : super
end
这基本上是说如果 end_date
in db 是 Float::INFINITY
return DateTime::Infinity.new
as end_date
,否则 return 数据库中的内容。
Ruby 2.6引入了endless range,可以这样使用,例如:
(DateTime.now..)
(DateTime.now...)
这提供了一种回答这个问题的新方法。希望它对某人有用!