模式匹配 #
一、match 表达式 #
1.1 基本用法 #
rust
fn main() {
let number = 3;
match number {
1 => println!("一"),
2 => println!("二"),
3 => println!("三"),
_ => println!("其他"),
}
}
1.2 必须穷尽 #
match 必须覆盖所有可能:
rust
fn main() {
let number = 7;
match number {
1 => println!("一"),
2 => println!("二"),
3 => println!("三"),
_ => println!("其他"), // 必须有默认分支
}
}
1.3 返回值 #
match 是表达式,可以返回值:
rust
fn main() {
let number = 3;
let result = match number {
1 => "一",
2 => "二",
3 => "三",
_ => "其他",
};
println!("结果: {}", result);
}
二、匹配 Option #
2.1 基本匹配 #
rust
fn main() {
let some_value = Some(5);
match some_value {
Some(x) => println!("值: {}", x),
None => println!("无值"),
}
}
2.2 提取值 #
rust
fn main() {
let some_value = Some(5);
let result = match some_value {
Some(x) => x * 2,
None => 0,
};
println!("结果: {}", result);
}
三、匹配 Result #
rust
fn main() {
let result: Result<i32, &str> = Ok(42);
match result {
Ok(value) => println!("成功: {}", value),
Err(e) => println!("错误: {}", e),
}
}
四、模式语法 #
4.1 字面量模式 #
rust
fn main() {
let x = 1;
match x {
1 => println!("一"),
2 => println!("二"),
_ => println!("其他"),
}
}
4.2 变量绑定 #
rust
fn main() {
let x = Some(5);
match x {
Some(y) => println!("值: {}", y),
None => println!("无值"),
}
}
4.3 多重模式 #
rust
fn main() {
let x = 1;
match x {
1 | 2 => println!("一或二"),
3..=5 => println!("三到五"),
_ => println!("其他"),
}
}
4.4 范围模式 #
rust
fn main() {
let x = 5;
match x {
1..=5 => println!("1到5"),
6..=10 => println!("6到10"),
_ => println!("其他"),
}
}
4.5 解构结构体 #
rust
struct Point {
x: i32,
y: i32,
}
fn main() {
let p = Point { x: 10, y: 20 };
match p {
Point { x, y } => println!("({}, {})", x, y),
}
// 部分解构
match p {
Point { x, .. } => println!("x = {}", x),
}
}
4.6 解构枚举 #
rust
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
fn main() {
let msg = Message::Move { x: 10, y: 20 };
match msg {
Message::Quit => println!("退出"),
Message::Move { x, y } => println!("移动到 ({}, {})", x, y),
Message::Write(text) => println!("文本: {}", text),
Message::ChangeColor(r, g, b) => println!("颜色: ({}, {}, {})", r, g, b),
}
}
4.7 解构元组 #
rust
fn main() {
let tuple = (1, 2, 3);
match tuple {
(1, y, z) => println!("第一个是1, y={}, z={}", y, z),
(x, 2, z) => println!("第二个是2, x={}, z={}", x, z),
_ => println!("其他"),
}
}
4.8 忽略值 #
rust
fn main() {
let tuple = (1, 2, 3);
match tuple {
(first, _, _) => println!("第一个: {}", first),
}
}
4.9 @ 绑定 #
rust
fn main() {
let x = 5;
match x {
n @ 1..=5 => println!("1到5: {}", n),
n @ 6..=10 => println!("6到10: {}", n),
_ => println!("其他"),
}
}
五、匹配守卫 #
5.1 基本用法 #
rust
fn main() {
let x = Some(5);
match x {
Some(n) if n > 3 => println!("大于3: {}", n),
Some(n) => println!("值: {}", n),
None => println!("无值"),
}
}
5.2 多条件 #
rust
fn main() {
let x = 5;
let y = true;
match x {
n if n > 3 && y => println!("大于3且y为真: {}", n),
n if n > 3 => println!("大于3: {}", n),
_ => println!("其他"),
}
}
六、if let #
6.1 简化匹配 #
rust
fn main() {
let some_value = Some(5);
// 使用 match
match some_value {
Some(x) => println!("值: {}", x),
_ => (),
}
// 使用 if let(更简洁)
if let Some(x) = some_value {
println!("值: {}", x);
}
}
6.2 带 else #
rust
fn main() {
let some_value: Option<i32> = None;
if let Some(x) = some_value {
println!("值: {}", x);
} else {
println!("无值");
}
}
七、while let #
rust
fn main() {
let mut stack = vec![1, 2, 3];
while let Some(top) = stack.pop() {
println!("弹出: {}", top);
}
}
八、实践示例 #
8.1 状态机 #
rust
enum State {
Idle,
Running,
Paused,
Stopped,
}
fn main() {
let state = State::Running;
match state {
State::Idle => println!("空闲"),
State::Running => println!("运行中"),
State::Paused => println!("已暂停"),
State::Stopped => println!("已停止"),
}
}
8.2 计算器 #
rust
enum Operator {
Add,
Sub,
Mul,
Div,
}
fn calculate(a: f64, op: Operator, b: f64) -> Option<f64> {
match op {
Operator::Add => Some(a + b),
Operator::Sub => Some(a - b),
Operator::Mul => Some(a * b),
Operator::Div => {
if b != 0.0 {
Some(a / b)
} else {
None
}
}
}
}
fn main() {
let result = calculate(10.0, Operator::Add, 5.0);
match result {
Some(v) => println!("结果: {}", v),
None => println!("计算错误"),
}
}
8.3 解析命令 #
rust
enum Command {
Help,
Quit,
Echo(String),
Move { x: i32, y: i32 },
}
fn execute(cmd: Command) {
match cmd {
Command::Help => println!("帮助信息"),
Command::Quit => println!("退出"),
Command::Echo(text) => println!("{}", text),
Command::Move { x, y } => println!("移动到 ({}, {})", x, y),
}
}
fn main() {
execute(Command::Help);
execute(Command::Echo(String::from("Hello")));
execute(Command::Move { x: 10, y: 20 });
}
九、总结 #
本章学习了:
match表达式- 模式语法
- 匹配守卫
if let简化匹配while let循环匹配- 各种解构模式
下一章,我们将学习函数。
最后更新:2026-03-27