我正在阅读the Rust book并试图了解PartialEq
和Eq
特征的用例。
我意识到PartialEq
是关于不一定反身的关系(即可能有x
这样的x != x
)和Eq
是一种标记特征,它表示关系也是反身的(现在它是一种适当的等价关系)。
这些书给出了一个例子,其中PartialEq
是不够的,需要Eq
:HashMap<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
。
决定何时使用PartialEq
vs Eq
应该基于使用是否需要x == x
。
问题不是关于是否有可能将x
与x
进行比较,而是如果发生这种比较,那么使用是否依赖于x==x
总是持有?如果答案是肯定的,请使用Eq
。否则更喜欢较弱的约束PartialEq
。
assert_eq!
does不依赖于x==x
总是持有所以没有必要强制对调用者的约束。 OP简明扼要地提到了评论中的两个例子:
如果我们做
assert_eq!(NAN, produces_nan())
- 这是我们的问题,它给false
,但如果我们在NAN
查找HashMap
密钥,这将是HashMap
的问题,因为它会违反其查询合同(它应该能够找到放在地图上的所有键)