如何在ruby中设置比较元素?

YiL*_*Luo 1 ruby set

我试图将自定义对象放在一个集合中.我试过这个:

require 'set'

class Person
  include Comparable

  def initialize(name, age)
    @name = name
    @age = age
  end
  attr_accessor :name, :age

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

a = Person.new("a", 18)
b = Person.new("a", 18)
people = Set[]
people << a
people << b

puts a == b # true
Run Code Online (Sandbox Code Playgroud)

似乎Set没有使用Object#eql?==方法识别相同的对象:

puts people # #<Set: {#<Person:0x00007f9e09843df8 @name="a", @age=18>, #<Person:0x00007f9e09843da8 @name="a", @age=18>}>
Run Code Online (Sandbox Code Playgroud)

如何Set识别两个相同的对象?

spi*_*ann 5

来自文档:

Set使用Hash存储,所以你必须注意以下几点:

  • 元素的平等根据Object#eql?和确定Object#hash.[...]

那就是说:如果你想让两个人在同一个名字时保持平等,那么你必须相应地实施hash:

def hash
  @name.hash
end
Run Code Online (Sandbox Code Playgroud)