Skip to content

实战总结

> 综合运用枚举知识,识别常见错误模式,巩固枚举设计与模式匹配技能。

常见错误

错误 1:非穷尽匹配

rust
enum 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!("其他方向"),
    }
}
▶ Run

错误信息:

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
fn 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);
}
▶ Run

错误 3:错误使用 unwrap

rust
fn 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)?;
}
▶ Run

练习

练习 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单一模式匹配

关键要点

  1. 枚举变体可以携带数据,比 C 语言枚举更强大
  2. match 必须穷尽,或提供通配符 _
  3. Option 替代 null,编译器强制检查
  4. Result 处理错误,?操作符简化传播
  5. 枚举和方法结合,实现领域建模

练习题

详见:练习题