0

我想用float_cmp::approx_eq(例如)完成所有浮点比较,但继续使用相等比较运算符==。我如何实现这一目标?

impl PartialEq for f32 {
    fn eq(&self, other: &Self) -> bool {
        approx_eq!(f32, *self, *other)
    }
}

结果是:

error[E0119]: conflicting implementations of trait `std::cmp::PartialEq` for type `f32`
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
4

1 回答 1

5

这是不可能的:

  • 此特征实现与现有实现直接冲突。没有特征覆盖机制。将来,您可能能够专门化通用特征实现,但这无论如何都不会被涵盖。

  • Rust 有“孤儿规则”来管理你可以定义的 trait 实现。简而言之,特征或类型的某些部分必须由当前的 crate 定义。PartialEq两者都不f32由您定义,因此您无法创建此实现。

  • approx_eq!宏 fromfloat_cmp扩展为内部使用的代码,==因此如果允许这种实现将导致无限递归。

我不认为有办法做到这一点,我不确定我是否会建议使用它,即使有。这将影响进行浮点比较的所有情况,甚至在您的依赖关系深处可能最终导致问题。即使您明确想要这样做,这也几乎没有选择进行非近似相等。

您应该处理只想明确考虑近似相等的情况。

于 2021-12-20T02:21:55.100 回答