gpt4 book ai didi

ruby-on-rails - Ruby 怪异 : x == y && [x, y].uniq == [x, y]

转载 作者:数据小太阳 更新时间:2023-10-29 07:00:53 27 4
gpt4 key购买 nike

我有一个 ActiveRecord 对象的二元素数组,slots_to_import。这些对象具有 begin_at 列,因此具有属性。我试图获取具有唯一 begin_at 值的对象。 las,slots_to_import.uniq_by(&:begin_at) 不起作用。但是两个对象的 begin_at 值是相等的:

(rdb:1) p slots_to_import.first.begin_at == slots_to_import.last.begin_at
true
(rdb:1) p slots_to_import.uniq_by(&:begin_at).map(&:begin_at)
[Mon, 26 Nov 2012 19:00:00 UTC +00:00, Mon, 26 Nov 2012 19:00:00 UTC +00:00]
(rdb:1) p [slots_to_import.first.begin_at, slots_to_import.last.begin_at].uniq
[Mon, 26 Nov 2012 19:00:00 UTC +00:00, Mon, 26 Nov 2012 19:00:00 UTC +00:00]

更多检查:

(rdb:1) p [slots_to_import.first.begin_at.to_datetime, slots_to_import.last.begin_at.to_datetime].uniq
[Mon, 26 Nov 2012 19:00:00 +0000]
(rdb:1) p [slots_to_import.first.begin_at.usec, slots_to_import.last.begin_at.usec].uniq
[0]
(rdb:1) p [slots_to_import.first.begin_at.to_f, slots_to_import.last.begin_at.to_f].uniq
[1353956400.0]
(rdb:1) p [slots_to_import.first.begin_at.utc, slots_to_import.last.begin_at.utc].uniq
[Mon, 26 Nov 2012 19:00:00 +0000]
(rdb:1) p [slots_to_import.first.begin_at, slots_to_import.last.begin_at].uniq
[Mon, 26 Nov 2012 19:00:00 UTC +00:00, Mon, 26 Nov 2012 19:00:00 UTC +00:00]

我想也许 uniq 正在检查它们是否是同一个对象(因为它们不是)。但是不,我的 rails 控制台中的一些小问题告诉我它不使用对象 id 检查:

1.8.7 :111 > x = Time.zone.parse("Mon, 29 Oct 2012 19:29:17 UTC +00:00")
=> Mon, 29 Oct 2012 19:29:17 UTC +00:00
1.8.7 :112 > y = Time.zone.parse("Mon, 29 Oct 2012 19:29:17 UTC +00:00")
=> Mon, 29 Oct 2012 19:29:17 UTC +00:00
1.8.7 :113 > x == y
=> true
1.8.7 :114 > [x, y].uniq
=> [Mon, 29 Oct 2012 19:29:17 UTC +00:00]

我使用的是 Ruby 1.8.7p358 和 ActiveSupport 3.2.0。顺便说一句,我可以通过简单地添加一个 to_datetime 来解决我自己的问题,但我真的很好奇为什么这在没有转换的情况下不起作用。

最佳答案

我以为您正在使用普通的 Time 对象,所以我开始查看 Ruby 平台源代码 (1.9.3) 中的 time.c。如果它们是 Ruby 1.9.3 Time 对象,您可以尝试:

[x.to_r, y.to_r]

现在我知道您正在使用 ActiveSupport::TimeWithZone 对象。 (作为建议,下次您发布问题时最好提及类似这样的关键信息。)这是 ActiveSupport::TimeWithZone#eql? 的正文:

def eql?(other)
utc == other
end

这里是散列函数:

alias :hash, :to_i

所以下一步是让你展示你从 [x.utc, y.utc, x.to_i, y.to_i, x.utc.class, y.utc.class].

关于ruby-on-rails - Ruby 怪异 : x == y && [x, y].uniq == [x, y],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13129461/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com