什么时候只需要PartialEq而不是Eq?

问题描述 投票:10回答:1

我正在阅读the Rust book并试图了解PartialEqEq特征的用例。

我意识到PartialEq是关于不一定反身的关系(即可能有x这样的x != x)和Eq是一种标记特征,它表示关系也是反身的(现在它是一种适当的等价关系)。

这些书给出了一个例子,其中PartialEq是不够的,需要EqHashMap<K, V>查找。实际上,如果我们使用仅实现PartialEq(例如浮点数)的数据类型作为键,当我们尝试使用NaN作为键时,我们会遇到麻烦,因为我们将无法找到它。

现在,我试图了解查找的哪些特性使它需要Eq。如果我找到一个不需要Eq的代码示例,我可能会更好地理解它。

该书说,assert_eq!只需要PartialEq,以便我们能够比较事物的平等。但是如果我们在测试中编写assert_eq!(f64::NAN, some_code_producing_nan());,测试将始终失败。我们有一个基本的问题,就像在PartialEq中使用HashMap键一样,但由于某种原因,它在这里被认为是合适的。

什么是合理的功能的例子,只需要PartialEq和添加Eq是不可取的/没有意义?

如果没有这样的用例,那么我们为什么要关心将它分成两个特征PartialEq / Eq?例如,Haskell就有Eq

rust traits
1个回答
6
投票

决定何时使用PartialEq vs Eq应该基于使用是否需要x == x

问题不是关于是否有可能将xx进行比较,而是如果发生这种比较,那么使用是否依赖于x==x总是持有?如果答案是肯定的,请使用Eq。否则更喜欢较弱的约束PartialEq

assert_eq!does不依赖于x==x总是持有所以没有必要强制对调用者的约束。 OP简明扼要地提到了评论中的两个例子:

如果我们做assert_eq!(NAN, produces_nan()) - 这是我们的问题,它给false,但如果我们在NAN查找HashMap密钥,这将是HashMap的问题,因为它会违反其查询合同(它应该能够找到放在地图上的所有键)

© www.soinside.com 2019 - 2024. All rights reserved.