gpt4 book ai didi

ruby - 在 ruby​​ 中实现平等的正确方法是什么

转载 作者:数据小太阳 更新时间:2023-10-29 06:21:38 25 4
gpt4 key购买 nike

对于一个简单的类结构类:

class Tiger
attr_accessor :name, :num_stripes
end

正确实现相等性的正确方法是什么,以确保 =====eql? 等有效,这样类的实例就可以在集合、哈希等中很好地发挥作用。

编辑

此外,当您想根据未在类外公开的状态进行比较时,实现相等性的好方法是什么?例如:

class Lady
attr_accessor :name

def initialize(age)
@age = age
end
end

在这里,我希望我的平等方法将@age 考虑在内,但女士不会向客户公开她的年龄。在这种情况下我必须使用 instance_variable_get 吗?

最佳答案

要简化具有多个状态变量的对象的比较运算符,请创建一个以数组形式返回所有对象状态的方法。然后只是比较两个状态:

class Thing

def initialize(a, b, c)
@a = a
@b = b
@c = c
end

def ==(o)
o.class == self.class && o.state == state
end

protected

def state
[@a, @b, @c]
end

end

p Thing.new(1, 2, 3) == Thing.new(1, 2, 3) # => true
p Thing.new(1, 2, 3) == Thing.new(1, 2, 4) # => false

此外,如果您希望类的实例可用作哈希键,请添加:

  alias_method :eql?, :==

def hash
state.hash
end

这些需要公开。

关于ruby - 在 ruby​​ 中实现平等的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1931604/

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