Rust 模式匹配
学习match · 难度:进阶 · +15XP
Rust 模式匹配
模式匹配(Pattern Matching)是 Rust 语言最强大和最常用的特性之一。match 表达式类似于其他语言中的 switch,但功能要强大得多——它可以解构元组和结构体、匹配范围、匹配枚举变体,并且编译器会强制要求你处理所有可能的情况(穷尽性检查),这极大地提升了代码的安全性。
match 的基本用法
match 的基本结构是将一个值与多个模式(也叫分支或 arm)进行比较,匹配成功后执行对应的代码块。每个分支由模式和 => 后的表达式组成,多个分支之间用逗号分隔。match 表达式会返回一个值。
fn main() {
let number = 3;
let result = match number {
1 => "一",
2 => "二",
3 => "三",
4 | 5 => "四或五", // 多个值可以用 | 组合
6..=10 => "六到十", // 范围匹配
_ => "其他数字", // _ 是通配符,匹配所有未处理的情况
};
println!("数字 {} 对应: {}", number, result);
}
匹配 Option 枚举
| 变体 | 含义 | 匹配语法 |
|---|---|---|
Some(value) | 包含一个有效值 | Some(v) => println!("值为: {}", v) |
None | 没有值(空) | None => println!("没有数据") |
Some(_) | 匹配 Some 但不使用内部值 | Some(_) => println!("有数据") |
fn get_grade(score: Option<u32>) -> String {
match score {
None => "未参加考试".to_string(),
Some(s) if s >= 90 => "优秀".to_string(),
Some(s) if s >= 80 => "良好".to_string(),
Some(s) if s >= 60 => "及格".to_string(),
Some(_) => "不及格".to_string(),
}
} // 注意: if 条件叫做"匹配守卫(match guard)"
fn main() {
let scores = vec![Some(95), Some(72), None, Some(55)];
for s in &scores {
println!("成绩: {}", get_grade(*s));
}
}
解构结构体和枚举
struct Point {
x: i32,
y: i32,
}
enum Message {
Quit,
Move { x: i32, y: i32 }, // 匿名结构体变体
Write(String), // 元组变体
ChangeColor(i32, i32, i32), // 元组变体
}
fn process(msg: Message) {
match msg {
Message::Quit => println!("退出"),
Message::Move { x, y } => println!("移动到 ({}, {})", x, y),
Message::Write(text) => println!("消息: {}", text),
Message::ChangeColor(r, g, b) =>
println!("改变颜色: rgb({}, {}, {})", r, g, b),
}
}
if let 和 while let 简洁模式
当你只关心某一种匹配情况时,可以使用 if let 来简化代码。它等价于只处理一个分支的 match,忽略其他所有情况。
- 使用 match 编写一个「星期转换器」,输入 1-7 返回对应的中文星期名称
- 编写函数,使用 Option 和 match 实现安全除法(除数为 0 时返回 None)
- 定义一个
Shape枚举(Circle, Rectangle, Triangle),用 match 计算不同形状的面积 - 使用 if let 简化对 Option 和 Result 类型的处理,并对比与 match 的写法差异
- 在 match 中使用匹配守卫(match guard)实现更复杂的条件筛选