gpt4 book ai didi

ruby - 扩展 uniq 方法

转载 作者:数据小太阳 更新时间:2023-10-29 08:15:37 24 4
gpt4 key购买 nike

这是 Ruby 1.8 问题:

我们都知道如何使用Array#uniq:

[1,2,3,1].uniq #=> [1,2,3]

但是我想知道我们是否可以通过猴子修补它来处理复杂的对象。当前的行为是这样的:

[{"three"=>"3"}, {"three"=>"4"}, {"three"=>"3"}].uniq 
#=> [{"three"=>"3"}, {"three"=>"4"}, {"three"=>"3"}]

请求的是:

[{"three"=>"3"}, {"three"=>"4"}, {"three"=>"3"}].uniq 
#=> [{"three"=>"3"}, {"three"=>"4"}]

最佳答案

要使 Array#uniq 适用于任何对象,您必须覆盖两个方法:hash 和 eql?

所有对象都有一个 hash 方法来计算该对象的哈希值,因此要使两个对象相等,它们的哈希值也必须相等。

示例——如果用户的电子邮件地址是唯一的,则用户是唯一的:

class User
attr_accessor :name,:email

def hash
@email.hash
end

def eql?(o)
@email == o.email
end
end

>> [User.new('Erin Smith','roo@example.com'),User.new('E. Smith','roo@example.com')].uniq
=> [#<User:0x1015a97e8 @name="Erin Smith", @email="maynurd@example.com"]

关于ruby - 扩展 uniq 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1558166/

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