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

How to tell rust to do all float comparisons using a given lib by default?

我想用 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

这是不可能的:

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

  • Rust 有 "orphan rules" 来管理您可以定义的特征实现。简而言之,trait 或 type 的某些部分必须由当前 crate 定义。 PartialEqf32 都不是您定义的,因此您无法创建此实现。

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

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

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