簡體   English   中英

如果f32不是Eq,為什么要編譯?

[英]If f32 is not Eq, why does this compile?

我有一個通用類型,例如

impl<T: Eq> Eq for Complex<T> where T: Eq {}

出於某種原因,即使f32不(無法)支持完全比較(因為nan!= nan),我也可以制作Complex<f32>並對其進行編譯並調用eq() )。

這怎么可能?

eq方法(使用==運算符時會調用)是PartialEq特性的一部分,而不是Eq

Eq特性從PartialEq繼承其所有方法,不添加任何方法,其唯一目的是作為標記,證明==運算符在實現類型上形成等價關系

HashMap這樣的類型依賴Eq而不是PartialEq ,因此它們可以做出邏輯保證-例如:

  • 必須有可能使用與插入時相同的鍵來檢索值
  • 如果存在哈希沖突,則該實現仍可以使用==來區分不同的鍵,因此一個不能替代另一個。

派生Eq的實現始終是安全的,因為僅當所有子字段也是Eq它才有效。 但是,如果您自己實現Eq ,則需要確保維持等價關系不變式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM