我试图将自定义对象放在一个集合中.我试过这个:
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识别两个相同的对象?
来自文档:
Set使用Hash存储,所以你必须注意以下几点:
- 元素的平等根据
Object#eql?和确定Object#hash.[...]
那就是说:如果你想让两个人在同一个名字时保持平等,那么你必须相应地实施hash:
def hash
@name.hash
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |