Rust 模式匹配学习笔记
Rust 的 模式匹配是一个强大的工具,它可以在 match、if let、while let、for 等语法中使用,允许我们根据数据结构的形状做不同操作。下面总结一些核心用法。
1. if let —— 关注单一模式
if let 用于只关心某个特定模式的情况。
let favorite_color: Option<&str> = None;
if let Some(color) = favorite_color {
println!("Favorite color: {}", color);
} else {
println!("Favorite color is none");
}
- 只关心这里的favorite_color是否匹配 Some(color) 这个“模板”。
- else可有可不有。
while let 也类似,用于循环匹配:
while let Some(num) = stack.pop() {
println!("{}", num);
}
2. 模式在for循环中
可以在 for 循环里解构元素:
for (index, value) in v.iter().enumerate() {
println!("{} is at index {}", value, index);
}
3. 可辩驳(refutable)与不可辩驳(irrefutable)
- let 左边只接受不可辩驳模式(一定能匹配成功),否则报错。
- if let 可用于可辩驳模式(可能匹配也可能不匹配)。
4. 范围匹配和解构
-
数字或字符可以用范围:
match x { 1..=5 => println!("one through five"), _ => println!("something else"), } -
结构体结构:
let Point { x: a, y: b } = p; println!("{}, {}", a, b); -
结构体模式匹配:
match p { // 下面就是一个又一个的“模板”,看看p能够嵌入到哪一个模板! Point { x, y: 0 } => println!("On the x axis at {}", x), Point { x: 0, y } => println!("On the y axis at {}", y), Point { x, y } => println!("On neither axis: ({}, {})", x, y), }
5. 枚举模式匹配
枚举变体可以是 不带值、元组风格 或 结构体风格:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(Color),
}
if let Message::Move { x, y } = my_move {
println!("my move: {}, {}", x, y);
}
match msg {
Message::ChangeColor(Color::Rgb(r, g, b)) => { /* ... */ },
Message::ChangeColor(Color::Hsv(h, s, v)) => { /* ... */ },
_ => {}
}
- 元组风格使用(),结构体风格使用 {}
7. 匹配守卫
在模式匹配后加条件:
match num {
Some(x) if x > 5 => println!("x is greater than 5"),
Some(x) => println!("x is not greater than 5: {}", x),
None => (),
}