4

我认为解释这一点的最好方法是举个例子:

class A
    attr_accessor :test
    def initialize(x = nil)
        @test = x
    end

    def ==(other)
        return @test == other.test
    end
end

a1 = A.new(1) # => #<A:0x11b7118 @test=1>
a1.test # => 1

a2 = A.new(1) # => #<A:0x11fb0f8 @test=1>
a2.test # => 1

a1 == a2 # => true
[a1].include?(a2) # => true
[a1] - [a2] # => [#<A:0x11b7118 @test=1>]

在这个例子中,我如何让 [a1] - [a2] 返回一个空数组,就像人们期望它为任何其他 Ruby 类一样?是否有一些我必须为我缺少的 A 定义的方法?

4

2 回答 2

7

您需要覆盖eql?hash。这些是用于那些集合操作的那些。

于 2012-08-30T14:45:46.540 回答
3

将这些方法添加到 A

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

def hash
  @test.hash
end
于 2012-08-30T14:47:53.750 回答