如何告诉rust在默认情况下使用给定的lib进行所有浮点比较



我想用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具有";孤立规则";控制您可以定义哪些特性实现。简而言之,特性或类型的某些部分必须由当前机箱定义。PartialEqf32都不是您定义的,因此您无法创建此实现。

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

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

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

相关内容

  • 没有找到相关文章

最新更新