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

我意识到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

最佳答案

决定何时使用PartialEqEq应该基于使用是否需要x == x来决定。

问题不在于是否可以将xx进行比较,而是如果发生这种比较,使用是否取决于始终保持的x==x?如果答案是肯定的,请使用Eq。否则,请选择较弱的约束PartialEq
assert_eq!不依赖于始终保持的x==x,因此无需在调用方上强加该约束。正如OP在评论中简要提到的两个示例:

关于rust - 什么时候只需要PartialEq而不是Eq是合适的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55128808/

10-13 00:41