我正在阅读Rust书籍,并尝试了解PartialEq
and 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!
不依赖于x==x
始终保持状态,因此无需在调用方上强加该约束。正如OP在评论中简要提到的两个示例:
如果这样做
assert_eq!(NAN, produces_nan())
-这是它给我们的问题false
,但是如果我们在a中查询一个NAN
键HashMap
,那将是的问题HashMap
,因为它将违反其查询约定(它应该能够找到放置的所有键)在地图上)