代码之家  ›  专栏  ›  技术社区  ›  Dmitri Nesteruk

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

  •  0
  • Dmitri Nesteruk  · 技术社区  · 5 年前

    我有一个泛型类型,比如

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

    出于某种原因,我可以 Complex<f32> 让它编译并调用 eq() 尽管 f32 不支持完全比较(因为nan!=南)。

    这怎么可能?

    0 回复  |  直到 5 年前
        1
  •  2
  •   Peter Hall    5 年前

    这个 eq 方法(在使用 == 操作员)是 PartialEq 特质,不是 Eq 是的。

    这个 情商 trait继承了它的所有方法 部分 ,不添加任何内容,其唯一目的是作为一个标记来断言 == 运算符形成 equivalence relation 关于实现类型。

    类型如 HashMap 依靠 情商 而不是 部分 ,因此他们可以做出逻辑保证-例如:

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

    派生一个 情商 因为只有当所有子字段都是 情商 是的。但是,如果您实现 情商 你自己,你需要确保等价关系不变量得到支持。