结论:match 必须穷尽被匹配值的所有可能——编译器静态检查分支集合是否覆盖全部情况,漏一个就编译错误。_ 通配符兜底剩余一切,.. 忽略结构体/元组的其余字段,它们让穷尽性可写但也会"吞掉"未来新增的变体。
展开:穷尽性检查是 Rust 重构安全性的基石:给枚举加新变体后,所有没写 _ 的 match 都会报编译错误,等于编译器帮你列出全部待改点。陷阱正在于此——一旦写了 _,新增变体会被静默归入兜底分支,逻辑上该特判的情况被漏掉。工程实践:对业务核心枚举(状态机、错误类型)坚持逐变体罗列,只对真正"其余情况统一处理"的场景用 _。.. 同理:结构体加字段后,Foo { a, .. } 依旧编译通过,新字段被悄悄忽略。
enum State { Idle, Running(u32), Done }
fn label(s: &State) -> &'static str {
match s {
State::Idle => "idle",
State::Running(n) if *n > 100 => "busy",
State::Running(_) => "running",
State::Done => "done",
}
}
易错点:带守卫(if 条件)的分支不参与穷尽性证明,后面仍需兜底。追问方向:if let 何时比 match 合适、matches! 宏。