如何告诉 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 定义。 PartialEq
和 f32
都不是您定义的,因此您无法创建此实现。
float_cmp
中的 approx_eq!
宏扩展为内部使用 ==
的代码,因此如果允许这样的实现将导致无限递归。
我不认为有什么方法可以做到这一点,即使有,我也不确定我是否会建议使用它。这会影响 所有 进行浮动比较的情况,甚至在您的依赖关系中很深,最终可能会导致问题。即使您明确想要,这也几乎没有选择进行非近似相等。
您应该处理只想明确考虑近似相等的情况。
我想用 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 定义。
PartialEq
和f32
都不是您定义的,因此您无法创建此实现。float_cmp
中的approx_eq!
宏扩展为内部使用==
的代码,因此如果允许这样的实现将导致无限递归。
我不认为有什么方法可以做到这一点,即使有,我也不确定我是否会建议使用它。这会影响 所有 进行浮动比较的情况,甚至在您的依赖关系中很深,最终可能会导致问题。即使您明确想要,这也几乎没有选择进行非近似相等。
您应该处理只想明确考虑近似相等的情况。