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的倒置默認值相同,因爲我在下面的答案中提到。