2012-05-22 45 views
5

我想爲一個ruby類實現==。我可以做Ruby中的「==」實現應該檢查類型嗎?

def ==(o) 
    o.respond_to?(:id) && self.id == o.id 
end 

def ==(o) 
    o.is_a?(Foo) && self.id == o.id 
end 

this文章,似乎前者會更有意義。如果我正在實施eql?那麼我會做後者。它是否正確?

+0

'=='並不意味着即使'eql''有更具體的要求,它也必須超越類型。但是,如圖所示,它可能更有用,因爲它更基於結構。 – 2012-05-22 18:57:12

+0

@pst你是說用'respond_to?'可以嗎? –

+0

在這種情況下'id'是什麼?它是否與Object#object_id相同,或者它是活動記錄ID還是實例變量的訪問器? –

回答

1

這取決於你是否比較任意對象或特定類型之一。第二種形式是具體的,第一種是通用的。

在你的情況下,你可能很好的具體形式。通用比較只有在與您比較的對象可以轉換或解釋爲可以匹配的東西時才相關。使用id似乎太開放了。這意味着當Foo 10和Bar 10可能來自完全不同的來源時,它們是相同的。

+1

對。我猜'.id'是一個不好的例子。我的班級實際上檢查'.job_id' –

相關問題