Rust:等值比较PartialEq 和Eq
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. 示例
下面是一个使用PartialEq
和Eq
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