ruby 2.7 引入了无始范围。现在你可以拥有:
(..5)
(5..10)
(10..)
使用整数,.include?
按预期工作:
(..5).include?(6) # false
(..5).include?(5) # true
(..5).include?(2) # true
(..5).include?(-100) # true
但是,这同样不适用于日期范围:
(..Date.tomorrow).include?(Date.today) # RangeError (cannot get the first element of beginless range)
有趣的是,它反过来工作:
(Date.yesterday..).include?(Date.today) # true
最后:
(Date.yesterday..).include?(Date.today - 2.days) # Seems to loop forever.
这是一种很奇怪的行为。所有 3 个案例都带来了不同的结果,其中只有 1 个实际按预期工作。
我的意思是,我想如果我们有一个具有某种“连续”逻辑的范围是可以理解的,它可能很难检查是否包含。但是像 Date 这样相对简单的类至少应该可以工作。无论如何,日期几乎就像一个整数。甚至 Float 也可以做到这一点,所以我不明白为什么 Date 或 DateTime 不应该。
我的用例是数据库可能会为我正在查询的 2 个日期提供 nil 。这些是我想在一个范围内使用的开始日期和结束日期,但我不能确定其中一个可能不是 nil,这对我的逻辑来说很好,但这会导致一个无开始的范围,这可以不处理.include?
。
我可以通过一些手动的丑陋检查轻松地使我的用例工作,但这不是优雅的 ruby 方式。我在这里错过了什么吗?或者这应该是一个尚不存在的功能?