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

If f32 is not Eq, why does this compile?

提问人:Dmitri Nesteruk 提问时间:7/13/2019 最后编辑:Peter HallDmitri Nesteruk 更新时间:7/13/2019 访问量:2428

问:

我有一个泛型类型,例如

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

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

这怎么可能?

Rust 浮点 特征 相等

评论


答:

7赞 Peter Hall 7/13/2019 #1

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

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

像 rely on 而不是 这样的类型,因此它们可以做出逻辑保证 - 例如:HashMapEqPartialEq

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

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