gpt4 book ai didi

ruby - Array#uniq() 忽略相同的 hash() 值?

转载 作者:太空宇宙 更新时间:2023-11-03 17:34:46 25 4
gpt4 key购买 nike

最小测试用例:

class C
def hash
3
end
end
[C.new, C.new].uniq
=> [#<C:0x00000003a05098>, #<C:0x00000003a05070>]

根据 the 1.9.3 Array#uniq docs它应该删除重复项。在源代码中,它从数组创建一个散列,循环散列,并将每个添加到一个新数组以返回。这个类 C 为所有对象返回相同的哈希键(你可以看到它是通过在其中扔一个 puts 来调用的),但是 uniq 返回的数组没有去重.

uniq 的定义还有其他内容吗?绝对不是 == 为项目返回 true。

最佳答案

Array#uniq 依赖于 hasheql? 进行比较:

class C
def hash
3
end
def eql?( c )
self.hash == c.hash
end
end

[C.new, C.new].uniq # #<C:0x00000000c70498>

注意:如果您要重载 eql?,那么您也应该重载 ==。插入到类定义中:

  alias :== :eql?

然后按预期进行评估:

C.new == C.new # => true

关于ruby - Array#uniq() 忽略相同的 hash() 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20388090/

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