我正在阅读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
key 存在相同的基本问题,但是由于某些原因,在这里认为它是适当的。
什么是仅需要PartialEq
且不希望添加Eq
的合理函数的示例?
如果没有这样的用例,那么为什么我们要关心将其分为PartialEq
/Eq
两个特征呢?例如,Haskell仅具有Eq
。
最佳答案
决定何时使用PartialEq
和Eq
应该基于使用是否需要x == x
来决定。
问题不在于是否可以将x
与x
进行比较,而是如果发生这种比较,使用是否取决于始终保持的x==x
?如果答案是肯定的,请使用Eq
。否则,请选择较弱的约束PartialEq
。assert_eq!
不依赖于始终保持的x==x
,因此无需在调用方上强加该约束。正如OP在评论中简要提到的两个示例:
关于rust - 什么时候只需要PartialEq而不是Eq是合适的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55128808/