2013-07-16 107 views
1

我希望我的課程是complete,適用於多種預期場景,包括對象比較。我的課程是Hash - 就像它有一個方法to_hash,許多我的課程完成方法都基於這個方法。例如:擴展核心類比較方法的最佳方法

class Hashlike 
    def == other 
    if other.respond_to?(:to_hash) 
     to_hash == other.to_hash 
    end 
    end 
end 

似乎矯枉過正覆蓋Hash#==只是注入相似到消息的速傳:

class Hash 
    def == other 
    # Flip the comparison 
    other.is_a?(Hashlike) ? other == self : super 
    end 
end 

這將在蹤跡最終處處爲完全不相干的問題。這感覺侵入性。

請問Hash知道我的Hashlike的比較資格嗎?一般來說,是否有擴展核心對象(Hash,Array)以接收核心接口消息(==,nil?,<==>)的慣例,並且知道定製類而不在其超級鏈上留下指紋?

更新:

發生對我來說是使覆蓋呼叫沒有嗆人的潛在的大量使用的方法與早期的條件分支的希望超級第一唯一的優化:

class Hash 
    def == other 
    # Lazily delay the comparison 
    super or (other == self if other.is_a?(Hashlike)) 
    end 
end 

一些仔細的基準測試(大約10億次比較)表明,如果在接收對象上定義了to_hash,則使用這兩種方法的表現都與ruby的倒置默認值相同,因爲我在下面的答案中提到。

回答

1

散列已經這樣做。如果一個對象響應to_hashHash#==應該做other == self允許這樣的事情。