ruby - 无 DateTime 的 Ruby Benign vale
问题描述
比较时DateTimes
,所有被比较的对象必须是同一类型。但是,我有一个包含nil
日期的数据集。我想将这些日期视为比任何其他日期更早(或可能更新)的日期。有没有办法构建一个比任何其他日期更旧(或者更新)的良性值?
例子:
data = [
{ name: :foo, timestamp: make_benign(some_valid_timestamp) },
{ name: :bar, timestamp: make_benign(nil)}
]
data.sort_by{|datum| datum[:timestamp]} #=> [<bar>, <foo>]
data.max_by {|datum| datum[:timestamp]} #=> <foo>
data.min_by {|datum| datum[:timestamp]} #=> <bar>
编辑:我碰巧因为这个问题被困在 ruby 1.9 上,所以旧版本的 ruby 的解决方案会很好。(但较新的解决方案也很适合将来参考)
解决方案
从docs来看,要求不是“所有对象都是同一类型”。它说:
另一个应该是日期对象或作为天文儒略日数的数值。
因此,对于保证在任何日期之前/之后的良性值,您可以相应地使用-Float::INFINITY
和Float::INFINITY
。
DateTime.now > Float::INFINITY #=> false
DateTime.now > -Float::INFINITY #=> true
编辑:
所以我们需要一个适用于 Ruby 1.9 和 Rails 3.2.9 的解决方案,呵呵……
那么上面不起作用的原因是因为ActiveSupport 中的这个猴子补丁:
class DateTime
def <=>(other)
super other.to_datetime
end
end
这尤其成问题。不幸的是,您可能只需要使用“非常大/小的数字”来代替......
但是,如果您能够稍微升级到Rails 3.2.13(或手动应用此更新的猴子补丁),则方法签名已更改为:
class DateTime
def <=>(other)
super other.kind_of?(Infinity) ? other : other.to_datetime
end
end
...然后您可以使用Date::Infinity
(TIL that's a thing) 代替Float::Infinity
,并且该方法的此“固定”版本现在可以正确处理它:
DateTime.now > Date::Infinity.new #=> false
DateTime.now > -Date::Infinity.new #=> true
推荐阅读
- java - 无头模式下 Chromedriver 的问题
- ngrok - ngrok 为位于不同 IP 的站点工作(即远程服务器)
- tensorflow - 如何将特征提取器网络(例如 mobilenetv2)添加到 tensorflow 的对象检测 API
- composer-php - 通过 Composer 安装收到具有某些依赖项的错误
- python - 在 python 中安装 pysentiment
- laravel - 获取嵌套集合的总和失败 Laravel Eloquent
- javascript - 如何明确指定损坏的名称?
- c++ - C++/g++:在这种情况下编译器如何处理内存分配?
- jenkins - SVN:添加一组子目录,但只添加特定文件
- java - 在单个调度程序上观察到多个 Flowable,事件的消耗顺序与发出的顺序不同