2014-02-13 75 views
1

我有Foo類,並且我超載它的兩個方法==eql?哈希方法使用什麼平等?

class Foo 

    def initialize(bar) 
    @bar = bar 
    end 

    def bar 
    @bar 
    end 

    def ==(o) 
    self.bar == o.bar 
    end 

    def .eql?(o) 
    return ==(o) 
    end 

end 

我測試f1和下面f2是相對於這兩種方法等於:

u = User.find(12345) 
f1 = Foo.new(u) 
f2 = Foo.new(u) 

f1 == f2 # => true 
f1.eql?(f2) # => true 

但是Hash#has_key?並不使它們相等:

{f1 => true}.has_key?(f2) # => false 

什麼是Hash#has_key?中使用的等號方法?

+2

您的第一個代碼塊有一些錯誤,可能是在您爲示例剪下時引入的。或者,更準確地說,我不能使用'Foo'來複制結果 –

+0

你是對的@ neil-slater,我刪除了初始化方法和訪問器以提高可見性。 – pierallard

回答

2

包含Ruby的散列類型的大多數實現首先依賴散列(對於速度!),然後進行相等性檢查。爲了驗證它的工作原理,首先,你可以再補充

def hash 
    1 
end 

之後,你應該爲hash提供儘可能多的可能的不同返回值的工作,仍然是相同的,當對象被認爲是相等的(只要當然,速度很快)。

+0

謝謝!它完美的作品。我使用傳入參數初始化的對象哈希,如下所示:https://www.ruby-forum.com/topic/181819 – pierallard

2

它使用hash方法。你可以在那裏協調你的對象的屬性或類似的東西。在你的情況下,你希望散列值對於2個對象是相同的,當且僅當它們相等時。

+0

它使用'hash' *和*'eql?'。由於Pigeonhole原則,它*需要*檢查'eql?'以及相同的'hash值'。 –