标签: rust floating-point traits equality
我有一个通用类型,例如
impl<T: Eq> Eq for Complex<T> where T: Eq {}
由于某种原因,即使Complex<f32>不(不能)支持完全比较(因为nan!=),我也可以制作一个eq()并编译并调用f32。楠)。
Complex<f32>
eq()
f32
这怎么可能?
答案 0 :(得分:2)
eq方法(当您使用==运算符时被调用)是PartialEq特性的一部分,而不是Eq。
eq
==
PartialEq
Eq
Eq特性从PartialEq继承了所有方法,没有添加任何方法,其唯一目的是作为标记,断言==运算符形成了{{ 3}}上的实现类型。
像HashMap这样的类型依赖于Eq而不是PartialEq,因此它们可以做出逻辑保证-例如:
HashMap
派生Eq的实现始终是安全的,因为只有在所有子字段也是Eq的情况下,该实现才有效。但是,如果您自己实现Eq,则需要确保维持等价关系不变式。