【问题标题】:How can I override the .. and ... operators of Ruby Ranges to accept Float::INFINITY?如何覆盖 .. 和 ... Ruby Ranges 的运算符以接受 Float::INFINITY?
【发布时间】: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


【解决方案1】:

Ruby 2.6 引入了endless range,可以这样使用,例如:

(DateTime.now..)
(DateTime.now...)

这为回答这个问题提供了一种新方法。希望它对某人有用!

【讨论】:

    【解决方案2】:

    我认为您想要做的不是解决此类问题的正确方法。

    我的建议是简单地覆盖模型中的 end_date 方法:

    def end_date
      super == Float::INFINITY ? DateTime::Infinity.new : super
    end
    

    这基本上是说如果数据库中的end_dateFloat::INFINITY,则返回DateTime::Infinity.new 作为end_date,否则返回数据库中的内容。

    【讨论】:

    • @fatuhoku 好的,让我知道这是否有效。另外,很奇怪DateTime.now...Float::INFINITY 不适合你..
    猜你喜欢
    • 2012-11-23
    • 2022-11-17
    • 2011-03-20
    • 2014-01-05
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2011-03-04
    相关资源
    最近更新 更多