如果 f32 不是 Eq,为什么可以编译?

Dmi*_*ruk 4 floating-point equality traits rust

我有一个通用类型,例如

impl<T: Eq> Eq for Complex<T> where T: Eq {}
Run Code Online (Sandbox Code Playgroud)

由于某种原因,我能够制作 aComplex<f32>并让它编译和调用eq(),即使f32不(不能)支持完整比较(因为 nan!= nan)。

这怎么可能?

Pet*_*all 7

eq方法(在使用==运算符时调用)是特征的一部分PartialEq,而不是Eq

Eq特征继承了它的所有方法PartialEq,没有添加它自己的任何方法,它的唯一目的是作为一个标记来断言==操作符在实现类型上形成了等价关系。

HashMap依赖Eq而不是这样的类型PartialEq,因此它们可以做出逻辑保证 - 例如:

  • 必须能够检索具有与插入时相同的键的值
  • 如果存在哈希冲突,该实现仍然可以使用 区分不同的键==,因此一个不会替换另一个。

派生 的实现总是安全的,Eq因为只有当所有子字段也是 时它才有效Eq。但是,如果您Eq自己实现,则需要确保维护等价关系不变量。