我喜欢使用数组#Union或#|方法来返回删除重复项的对象array.我的类上有一个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">] 

推荐答案

您需要根据@Engineering ersmnky关于Object#eql?的 comments 同时实现eql?hash方法,即eql?期望实例散列相同

class A
  attr_accessor :name

  def initialize(name)
    @name = name
  end

  def eql?(other)
    other.name.eql?(@name)
  end

  def hash
    [@name].hash
  end
end

#declare inclusive range from 'a' to 'm'

names = 'a'..'m'

as = names.map { |name| A.new(name) }
bs = names.map { |name| A.new(name) }

as | bs



输出:

[#<A:0x0000558a74860020 @name="a">,
 #<A:0x0000558a7485bf98 @name="b">,
 #<A:0x0000558a7485bf70 @name="c">,
 #<A:0x0000558a7485bf48 @name="d">,
 #<A:0x0000558a7485bf20 @name="e">,
 #<A:0x0000558a7485bef8 @name="f">,
 #<A:0x0000558a7485bed0 @name="g">,
 #<A:0x0000558a7485bea8 @name="h">,
 #<A:0x0000558a7485bd90 @name="i">,
 #<A:0x0000558a7485bd40 @name="j">,
 #<A:0x0000558a7485bd18 @name="k">,
 #<A:0x0000558a7485bcf0 @name="l">,
 #<A:0x0000558a7485bcc8 @name="m">]

Ruby相关问答推荐

当bsearch将数组中的第一个元素与2个值匹配时,它返回nil.为什么?

CarrierWave Multi-uploader重命名现有文件

如何在将拆分元素保留为空字符串的同时拆分字符串?

在 clojure 中,如何将已排序整数数组划分为连续的分区?

使用数组作为其中之一转换键和值

Ruby反斜杠在新行上继续字符串?

ruby 中的魔术注释(#Encoding: utf-8)是如何工作的?

.nil?、.blank? 之间的区别?和.empty?

如何判断 Ruby 数组是否包含多个值之一?

Ruby 连接字符串并添加空格

Rails 类 << self

如何将 each每个方法添加到 Ruby 对象(或者我应该扩展 Array)?

我不明白Ruby本地范围(local scope)

如何设置方法测试中使用的私有实例变量?

为什么 Ruby 的 Date 类会自动加载,但 DateTime 不会?

如何获取当前 rake 任务的 PID?

Ruby 将标题发布到 slug

Ruby on rails - 静态方法

通过 factory_girl 协会查找或创建记录

从 'mm/dd/yyyy' 格式解析 ruby​​ DateTime