6

私はおおよそ次のようなクラスを持っています:

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

それでも、私がするとき:

s = Set.new
s.add(C.new)
s.include?(C.new) # => false

なんで?

4

3 に答える 3

3

Seteql?and hash、 notを使用して、 ==2 つのオブジェクトが等しいかどうかをテストします。たとえば、Set の次のドキュメントを参照してください。

2 つの異なるオブジェクトのセット メンバーシップを同じにしたい場合Cは、これら 2 つのメソッドをオーバーライドする必要があります。

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
于 2013-10-16T21:04:39.240 に答える
1
class C
    attr_accessor :board # board is a multidimensional array (represents a matrix)

    def initialize
        board = [[1],[2]] # initialize board
        p @board #=> nil !!

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

    def eql?(other) # not used
        puts "eql? called"
        @board == other.board
    end
    def ==(other) # not used
        puts "== called"
        @board == other.board
    end

    def hash
      puts "hash called"
      board.hash
    end
end
require 'set'
s = Set.new
s.add(c = C.new)
p s.include?(c) 

Set はハッシュを下のストレージとして使用します。出力:

nil
hash called
hash called
true
于 2013-10-16T21:11:11.423 に答える