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

dyi*_*ynx 12 traits rust

我正在阅读Rust书籍,并尝试了解PartialEqand Eq特质的用例。

我认识到,PartialEq是关系其不必是反射性(也就是说,可这样xx != 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

Spe*_*ark 8

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

问题不是关于是否可以进行比较xx而是是否进行比较,使用是否取决于x==x始终持有?如果答案是肯定的,请使用Eq。否则,请选择较弱的约束PartialEq

assert_eq!不依赖于x==x始终保持状态,因此无需在调用方上强加该约束。正如OP在评论中简要提到的两个示例:

如果这样做assert_eq!(NAN, produces_nan())-这是它给我们的问题false,但是如果我们在a中查询一个NANHashMap,那将是的问题HashMap,因为它将违反其查询约定(它应该能够找到放置的所有键)在地图上)