我有一个通用类型,例如
impl<T: Eq> Eq for Complex<T> where T: Eq {}
出于某种原因,我能够制作 Complex<f32>
并让它编译并调用 eq()
尽管 f32
不(不能)支持完全比较(因为 nan!=nan)。
这怎么可能?
最佳答案
eq
方法(当您使用 ==
运算符时调用)是 PartialEq
的一部分特征,不是 Eq
.
Eq
trait 从 PartialEq
继承了它的所有方法,没有添加它自己的方法,它的唯一目的是作为一个标记来断言 = =
运算符形成一个 equivalence relation关于实现类型。
像HashMap
这样的类型依赖于Eq
而不是PartialEq
,因此它们可以做出逻辑保证——例如:
- 必须可以使用与插入时相同的键检索值
- 如果存在哈希冲突,该实现仍然可以使用
==
区分不同的键,因此一个不会替换另一个。
派生 Eq
的实现总是安全的,因为它只有在所有子字段也是 Eq
时才有效。但是,如果您自己实现 Eq
,则需要确保支持等价关系不变量。
关于rust - 如果 f32 不是 Eq,为什么会编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57018002/