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

时间:2019-07-13 09:45:57

标签: rust floating-point traits equality

我有一个通用类型,例如

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

由于某种原因,即使Complex<f32>不(不能)支持完全比较(因为nan!=),我也可以制作一个eq()并编译并调用f32。楠)。

这怎么可能?

1 个答案:

答案 0 :(得分:2)

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

Eq特性从PartialEq继承了所有方法,没有添加任何方法,其唯一目的是作为标记,断言==运算符形成了{{ 3}}上的实现类型。

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

  • 必须能够使用与插入时相同的键来检索值
  • 如果发生哈希冲突,该实现仍可以使用==来区分不同的键,因此一个不能替代另一个。

派生Eq的实现始终是安全的,因为只有在所有子字段也是Eq的情况下,该实现才有效。但是,如果您自己实现Eq,则需要确保维持等价关系不变式。