rust - 如果 f32 不是 Eq,为什么会编译?

标签 rust floating-point traits equality

我有一个通用类型,例如

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/

相关文章:

rust - Trait 对象的方法,它接受多种数字类型

rust - 将相同变量绑定(bind)到共享特征的不同类型的模式

vector - 如何安全地从矢量中删除项目?

types - 函数是否可以根据函数中的条件语句返回不同的类型?

PHP 零浮点返回真

floating-point - 向量双双浮点运算

rust - 为什么 `impl Trait` 返回值实现 Send 而 `Box<dyn Trait>` 没有?

serialization - 我可以为单个结构以不同的方式多次实现相同的特征吗?

Python 3.3.5 浮点格式精度

Laravel:使用特征或扩展模型之间的区别