1

PartialEq 特性
PartialEq 提供了对部分相等性的支持。实现了 PartialEq 特性的类型可以使用 == 和 != 操作符来进行比较。这是一个基础的特性,用于检查两个值是否相等或不相等。

Eq 是 PartialEq 的一个子集,或者说是更严格的等价特性。它表示完全相等.如果一个类型实现了 Eq 特性,它也必须实现 PartialEq 特性。

自定义的是否相等的逻辑, Eq 使用标记的。

#[derive(Debug)]
struct Point {
    x: i32,
    y: i32,
}

impl PartialEq for Point {
    fn eq(&self, other: &Self) -> bool {
        self.x == other.x && self.y == other.y
    }
}

// Eq 的实现就是一个空实现,因为所有方法和逻辑已经在 PartialEq 中定义。
impl Eq for Point {}

fn main() {
    let p1 = Point { x: 1, y: 2 };
    let p2 = Point { x: 1, y: 2 };
    let p3 = Point { x: 2, y: 3 };

    assert!(p1 == p2);
    assert!(p1 != p3);

    println!("{:?} and {:?} are equal: {}", p1, p2, p1 == p2);
    println!("{:?} and {:?} are equal: {}", p1, p3, p1 == p3);
}

不是所有的都是实现了eq
Rust 标准库中 f32 和 f64 类型仅实现了 PartialEq,而没有实现 Eq
let nan = std::f32::NAN;
assert!(nan != nan); // 输出: true

PartialOrd 特性
PartialOrd 提供了对部分排序性的支持。实现了 PartialOrd 特性的类型可以使用 <, <=, >, 和 >= 操作符进行比较。与 Ord 特性不同, PartialOrd 允许部分有序关系,例如浮点数中的NaN情况。

Ord 是 PartialOrd 的一个子集,表示完全排序,没有特殊情况(例如NaN)。如果一个类型实现了 Ord 特性,它也必须实现 PartialOrd 、 Eq 和 PartialEq 特性。 Ord 特性要求提供一个通用的比较方法 cmp ,该方法返回 Ordering 枚举,表示小于、大于或等于关系。
PartialOrd 特性依赖 PartialEq 特性,因此你需要先为类型实现 PartialEq。
如果一个类型实现了 Ord,它必须同时实现 PartialOrd、Eq 和 PartialEq。

impl PartialOrd for Point {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        if self.x == other.x {
            Some(self.y.cmp(&other.y))
        } else {
            Some(self.x.cmp(&other.x))
        }
    }
}

Hash 特性
必须实现 Eq 特性:为了确保相同的值具有相同的哈希码,类型必须实现 Eq 特性。

impl Hash for Point {
    fn hash<H: Hasher>(&self, state: &mut H) {
        // 将需要哈希的字段添加到 `state`
        self.x.hash(state);
        self.y.hash(state);

        // 或者如果你希望自定义哈希逻辑,也可以这样:
        // state.write_i32(self.x);
        // state.write_i32(self.y);
    }
}

putao
8 声望1 粉丝

推动世界向前发展,改善民生。