我想用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具有";孤立规则";控制您可以定义哪些特性实现。简而言之,特性或类型的某些部分必须由当前机箱定义。
PartialEq
和f32
都不是您定义的,因此您无法创建此实现。 -
float_cmp
中的approx_eq!
宏扩展为内部使用==
的代码,因此如果允许这样的实现,将导致无限递归。
我不认为有办法做到这一点,我也不确定我是否会建议使用它,即使有。这将影响所有执行浮点比较的情况,甚至可能导致问题的深层依赖关系。即使你明确想这样做,也几乎没有选择进行非近似相等
您应该处理只想明确考虑近似相等的情况。