我的课程大致如下:
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)
为什么?
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)
| 归档时间: |
|
| 查看次数: |
2042 次 |
| 最近记录: |