Set.include?用于Ruby中的自定义对象

wha*_*ide 5 ruby

我的课程大致如下:

class C
    attr_accessor :board # board is a multidimensional array (represents a matrix)

    def initialize
        @board = ... # initialize board
    end   

    def ==(other)
        @board == other.board
    end
end
Run Code Online (Sandbox Code Playgroud)

当我做的时候:

s = Set.new
s.add(C.new)
s.include?(C.new) # => false
Run Code Online (Sandbox Code Playgroud)

为什么?

Hew*_*lff 5

Set使用eql?and hash、 not==来测试两个对象是否相等。例如,参见Set 的文档:“每对元素的相等性是根据 Object#eql? 和 Object#hash 确定的,因为 Set 使用哈希作为存储。”

如果您希望两个不同的C对象具有相同的集合成员身份,则必须重写这两个方法。

class C
  attr_accessor :board 

  def initialize
    @board = 12
  end

  def eql?(other)
    @board == other.board
  end

   def hash
    @board.hash
  end
end

s = Set.new
s.add C.new
s.include? C.new   # => true
Run Code Online (Sandbox Code Playgroud)