我喜欢使用数组#union或#|方法返回删除重复项的对象数组。我在我的类上有一个eql?
的自定义实现。如果我这样做的话,会有一种非常奇怪的行为。最多8个元素的联合只是工作正常,但更多的元素,重复不被删除。这是真的是一个错误的Ruby或我错过了什么?
class A
attr_accessor :name
def initialize(name)
self.name = name
end
def eql?(other)
other.name.eql?(name)
end
end
as = names.map { |name| A.new(name) }
bs = names.map { |name| A.new(name) }
as | bs
=>
[#<A:0x00007fe503692388 @name="a">,
#<A:0x00007fe503692310 @name="b">,
#<A:0x00007fe5036922e8 @name="c">,
#<A:0x00007fe5036922c0 @name="d">,
#<A:0x00007fe503692298 @name="e">,
#<A:0x00007fe503692270 @name="f">,
#<A:0x00007fe503692248 @name="g">,
#<A:0x00007fe503692220 @name="h">,
#<A:0x00007fe5036921f8 @name="i">,
#<A:0x00007fe5036921d0 @name="j">,
#<A:0x00007fe5036921a8 @name="k">,
#<A:0x00007fe503692180 @name="l">,
#<A:0x00007fe5035732e0 @name="a">,
#<A:0x00007fe5035732b8 @name="b">,
#<A:0x00007fe503573290 @name="c">,
#<A:0x00007fe503573268 @name="d">,
#<A:0x00007fe503573240 @name="e">,
#<A:0x00007fe503573218 @name="f">,
#<A:0x00007fe5035731f0 @name="g">,
#<A:0x00007fe5035731c8 @name="h">,
#<A:0x00007fe5035731a0 @name="i">,
#<A:0x00007fe503573178 @name="j">,
#<A:0x00007fe503573150 @name="k">,
#<A:0x00007fe503573128 @name="l">]
as[0..7] | bs[0..7]
=>
[#<A:0x00007fe503692388 @name="a">,
#<A:0x00007fe503692310 @name="b">,
#<A:0x00007fe5036922e8 @name="c">,
#<A:0x00007fe5036922c0 @name="d">,
#<A:0x00007fe503692298 @name="e">,
#<A:0x00007fe503692270 @name="f">,
#<A:0x00007fe503692248 @name="g">,
#<A:0x00007fe503692220 @name="h">]
1条答案
按热度按时间bwitn5fc1#
您需要根据@engineersmnky关于Object#eql?的评论实现
eql?
和hash
方法。,即eql?
期望示例哈希值相同输出: