Rust语言从入门到精通系列 - 如何判断对象是否相等?
981 字
5 分钟
Rust语言从入门到精通系列 - 如何判断对象是否相等?

在 Rust 语言中,PartialEq 和 Eq 是两个非常重要的 trait。它们用于比较类型的值,PartialEq 用于比较部分相等(不需要完全相等),而 Eq 用于比较完全相等。
在 Rust 中,任何类型都可以实现 PartialEq 和 Eq,因此这两个 trait 非常灵活。
基础用法
比较整数
fn main() { let a = 10; let b = 20; if a == b { println!("a equals b"); } else { println!("a does not equal b"); }}输出:
a does not equal b比较字符串
fn main() { let a = "hello"; let b = "world"; if a == b { println!("a equals b"); } else { println!("a does not equal b"); }}输出:
a does not equal b比较自定义类型
#[derive(PartialEq, Eq)]struct Person { name: String, age: u8,}
fn main() { let p1 = Person { name: "Alice".to_string(), age: 30, }; let p2 = Person { name: "Bob".to_string(), age: 30, }; if p1 == p2 { println!("p1 equals p2"); } else { println!("p1 does not equal p2"); }}输出:
p1 does not equal p2比较浮点数
fn main() { let a = 0.1 + 0.2; let b = 0.3; if a == b { println!("a equals b"); } else { println!("a does not equal b"); }}输出:
a does not equal b自定义比较函数
struct Person { name: String, age: u8,}
impl PartialEq for Person { fn eq(&self, other: &Self) -> bool { self.age == other.age }}
impl Eq for Person {}
fn main() { let p1 = Person { name: "Alice".to_string(), age: 30, }; let p2 = Person { name: "Bob".to_string(), age: 30, }; if p1 == p2 { println!("p1 equals p2"); } else { println!("p1 does not equal p2"); }}输出:
p1 equals p2比较枚举类型
#[derive(PartialEq, Eq)]enum Color { Red, Blue,}
fn main() { let c1 = Color::Red; let c2 = Color::Blue; if c1 == c2 { println!("c1 equals c2"); } else { println!("c1 does not equal c2"); }}输出:
c1 does not equal c2使用 assert_eq!宏
fn main() { let a = 10; let b = 20; assert_eq!(a, b);}输出:
thread 'main' panicked at 'assertion failed: `(left == right)` left: `10`, right: `20`', src/main.rs:4:5note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace使用 assert_ne!宏
fn main() { let a = 10; let b = 20; assert_ne!(a, b);}输出:
thread 'main' panicked at 'assertion failed: `(left != right)` left: `10`, right: `10`', src/main.rs:4:5note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace进阶用法
自定义比较函数
struct Person { name: String, age: u8,}
impl PartialEq for Person { fn eq(&self, other: &Self) -> bool { self.age == other.age }}
impl Eq for Person {}
fn main() { let p1 = Person { name: "Alice".to_string(), age: 30, }; let p2 = Person { name: "Bob".to_string(), age: 40, }; if p1 == p2 { println!("p1 equals p2"); } else { println!("p1 does not equal p2"); }}输出:
p1 does not equal p2使用泛型
#[derive(PartialEq, Eq)]struct Pair<T> { first: T, second: T,}
fn main() { let p1 = Pair { first: 1, second: 2, }; let p2 = Pair { first: 2, second: 1, }; if p1 == p2 { println!("p1 equals p2"); } else { println!("p1 does not equal p2"); }}输出:
p1 does not equal p2使用 PartialOrd 和 Ord
#[derive(PartialEq, Eq, PartialOrd, Ord)]struct Person { name: String, age: u8,}
fn main() { let p1 = Person { name: "Alice".to_string(), age: 30, }; let p2 = Person { name: "Bob".to_string(), age: 40, }; if p1 < p2 { println!("p1 is younger than p2"); } else { println!("p1 is older than or equal to p2"); }}输出:
p1 is younger than p2使用 Debug 和 Display
#[derive(Debug, PartialEq, Eq)]struct Person { name: String, age: u8,}
use std::fmt;
impl fmt::Display for Person { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{} ({})", self.name, self.age) }}
fn main() { let p1 = Person { name: "Alice".to_string(), age: 30, }; let p2 = Person { name: "Bob".to_string(), age: 40, }; println!("p1: {}", p1); println!("p2: {}", p2);}输出:
p1: Alice (30)p2: Bob (40)最佳实践
在实现 PartialEq 和 Eq 时,应该考虑以下几点:
- 对于自定义类型,应该比较所有的成员变量,而不仅仅是一部分。
- 对于浮点数,应该使用近似比较而不是精确比较。
- 对于枚举类型,应该比较所有的成员变量,而不仅仅是枚举值本身。
- 如果需要比较的类型实现了 PartialOrd 和 Ord,应该优先使用这两个 trait。
结论
在 Rust 语言中,PartialEq 和 Eq 是非常重要的 trait,用于比较类型的值。这两个 trait 非常灵活,任何类型都可以实现它们。在实现 PartialEq 和 Eq 时,应该考虑到类型的特点,比较所有的成员变量,使用近似比较等。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
Rust语言从入门到精通系列 - 如何判断对象是否相等?
https://tinyzzh.github.io/posts/2023-04-03-rust_lang_tutorial_125_trait_eq_partialeq/ 相关文章 智能推荐
1
Rust语言从入门到精通系列 - 生命周期
Rust 2023-03-17
2
Rust语言从入门到精通系列 - 格式化输出
Rust 2023-03-14
3
Rust语言从入门到精通系列 - 日志库
Rust 2023-03-14
4
Rust语言从入门到精通系列 - Rust泛型
Rust 2023-03-13
5
Rust语言从入门到精通系列 - Hello World!
Rust 2023-03-12
随机文章 随机推荐