如何告诉 Rust 默认使用给定的库进行所有浮点比较?

Spa*_*ler 1 operator-overloading comparison-operators rust floating-point-comparison

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

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

结果是:

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
Run Code Online (Sandbox Code Playgroud)

kmd*_*eko 6

这不可能:

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

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

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

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

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