likes
comments
collection
share

Rust:等值比较PartialEq 和Eq

作者站长头像
站长
· 阅读数 49

1. 简介

在Rust中,我们可以使用PartialEq trait和Eq trait来进行等值比较。这两个trait都定义在标准库中,它们提供了一种灵活的方式来定义自定义类型的等值比较。

pub trait PartialEq<Rhs: ?Sized = Self> {
    fn eq(&self, other: &Rhs) -> bool;
    fn ne(&self, other: &Rhs) -> bool { !self.eq(other) }
}

pub trait Eq: PartialEq<Self> {}

2. PartialEq trait

PartialEq trait用于定义两个值是否相等。它只有一个必须实现的方法:eq,该方法接受一个引用作为参数,并返回一个布尔值,表示两个值是否相等。

例如,我们可以为自定义类型实现PartialEq trait,以便能够使用==运算符进行等值比较:

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

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

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

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

3. Eq trait

Eq trait是一个空trait,它只是用来标记一个类型满足等价关系的性质。也就是说,如果一个类型实现了Eq trait,那么它必须满足自反性、对称性和传递性。

由于Eq trait继承自PartialEq<Self>,因此如果一个类型实现了Eq trait,那么它也必须实现了PartialEq<Self>

例如,我们可以为自定义类型同时实现PartialEq<Self>Eq

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

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

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

4. 示例

下面是一个使用PartialEqEq trait进行等值比较的示例代码:

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

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

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

5.PartialEq trait和Eq 有什么区别

PartialEq trait和Eq trait的主要区别在于它们定义的等值比较的性质不同。

PartialEq trait用于定义两个值是否相等,它只有一个必须实现的方法:eq。这个方法接受一个引用作为参数,并返回一个布尔值,表示两个值是否相等。PartialEq trait允许我们为自定义类型定义等值比较的方式。

Eq trait是一个空trait,它只是用来标记一个类型满足等价关系的性质。也就是说,如果一个类型实现了Eq trait,那么它必须满足自反性、对称性和传递性。由于Eq trait继承自PartialEq<Self>,因此如果一个类型实现了Eq trait,那么它也必须实现了PartialEq<Self>

简单来说,PartialEq trait允许我们定义两个值是否相等,而Eq trait则表示这种相等关系满足等价关系的性质。from刘金,转载请注明原文链接。感谢!

转载自:https://juejin.cn/post/7231893449800597562
评论
请登录