如何在 Rust 中自动实现带有浮点数的结构的比较



我正在尝试为像这样的简单结构自动"派生"比较功能:

#[derive(PartialEq, Eq)]
struct Vec3 {
    x: f64,
    y: f64,
    z: f64,
}

但是,Rust 1.15.1 抱怨:

error[E0277]: the trait bound `f64: std::cmp::Eq` is not satisfied
 --> src/main.rs:3:5
  |
3 |     x: f64,
  |     ^^^^^^ the trait `std::cmp::Eq` is not implemented for `f64`
  |
  = note: required by `std::cmp::AssertParamIsEq`

我到底应该怎么做才能允许在这里派生默认实现?

Rust 故意不为浮点类型实现Eq。 这个reddit的讨论可能会进一步阐明原因,但问题是浮点数不是完全可排序的,因此奇怪的边缘情况是不可避免的。

但是,如果要向结构添加比较,则可以改为派生PartialOrd。 这将为您提供比较运算符和相等运算符的实现:

#[derive(PartialEq, PartialOrd)]
struct Vec3 {
    x: f64,
    y: f64,
    z: f64,
}
fn main() {
    let a = Vec3 { x: 1.0, y: 1.1, z: 1.0 };
    let b = Vec3 { x: 2.0, y: 2.0, z: 2.0 };
    println!("{}", a < b); //true
    println!("{}", a <= b); //true
    println!("{}", a == b); //false
}

EqPartialEq之间的区别(因此OrdPartialOrd之间的区别在于,Eq要求==算子形成等价关系,而PartialOrd只要求==!=是逆的。 因此,就像浮点数本身一样,在对结构实例进行比较时,您应该牢记这一点。

最新更新