实战总结
> 综合运用枚举知识,识别常见错误模式,巩固枚举设计与模式匹配技能。
常见错误
错误 1:非穷尽匹配
rust
▶ Runenum Direction {
North,
South,
East,
West,
}
fn main() {
let dir = Direction::North;
// ❌ 错误:未处理所有情况
// match dir {
// Direction::North => println!("北"),
// Direction::South => println!("南"),
// }
// ✅ 正确
match dir {
Direction::North => println!("北"),
Direction::South => println!("南"),
Direction::East => println!("东"),
Direction::West => println!("西"),
}
// ✅ 或使用通配符
match dir {
Direction::North => println!("北"),
_ => println!("其他方向"),
}
}错误信息:
error[E0004]: non-exhaustive patterns: `Direction::East` and `Direction::West` not covered
--> src/main.rs:5:11
|
5 | match dir {
| ^^^ patterns `Direction::East` and `Direction::West` not covered错误 2:Option 未处理 None
rust
▶ Runfn get_value() -> Option<i32> {
Some(42)
}
fn main() {
let value = get_value();
// ❌ 错误:不能直接使用 Option
// println!("{}", value + 1);
// ✅ 正确
match value {
Some(v) => println!("{}", v + 1),
None => println!("没有值"),
}
// ✅ 或使用 unwrap_or
println!("{}", value.unwrap_or(0) + 1);
}错误 3:错误使用 unwrap
rust
▶ Runfn divide(a: i32, b: i32) -> Result<i32, &'static str> {
if b == 0 {
Err("除数不能为零")
} else {
Ok(a / b)
}
}
fn main() {
// ❌ 可能 panic
// let result = divide(10, 0).unwrap();
// ✅ 安全处理
match divide(10, 2) {
Ok(r) => println!("结果:{}", r),
Err(e) => println!("错误:{}", e),
}
// ✅ 或使用?(在返回 Result 的函数中)
let result = divide(10, 2)?;
}练习
练习 1:星期枚举
创建枚举表示一周的七天,实现:
next_day(&self)- 获取下一天is_weekend(&self)- 判断是否周末
练习 2:形状枚举
创建枚举表示不同形状(圆形、矩形、三角形),实现计算面积的方法。
练习 3:命令解析器
创建枚举表示命令行指令(Run、Stop、Restart、Status),使用 match 解析并执行。
小结
枚举要点
| 概念 | 说明 |
|---|---|
| 枚举定义 | enum Name { Variant1, Variant2 } |
| 带数据变体 | Variant { field: Type } 或 Variant(Type) |
| Option<T> | Some(T) / None - 空值处理 |
| Result<T, E> | Ok(T) / Err(E) - 错误处理 |
| match | 穷尽模式匹配 |
| if let | 单一模式匹配 |
关键要点
- 枚举变体可以携带数据,比 C 语言枚举更强大
- match 必须穷尽,或提供通配符
_ - Option 替代 null,编译器强制检查
- Result 处理错误,?操作符简化传播
- 枚举和方法结合,实现领域建模
练习题
详见:练习题