匹配u32取余2时,为何未覆盖`2_u32..=u32::MAX`模式?
Rust中
2_u32..=u32::MAX匹配错误解析 你的代码
fn main () { let my_val: u32 = 42; match my_val % 2 { 0 => println!("We're even now"), 1 => println!("Well, that's odd"), } }
编译错误信息
error[E0004]: non-exhaustive patterns: `2_u32..=u32::MAX` not covered --> src/main.rs:4:11 | 4 | match my_val % 2 { | ^^^^^^^^^^ pattern `2_u32..=u32::MAX` not covered | = note: the matched value is of type `u32` help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown | 6 ~ 1 => println!("Well, that's odd"), 7 ~ 2_u32..=u32::MAX => todo!(), |
问题解析
2_u32..=u32::MAX指的是从2到u32类型最大值(4294967295)的所有整数。
你可能会疑惑:按数学逻辑,u32类型的数模2的结果只能是0或1,为什么编译器会认为存在这个范围的取值?
原因是Rust的类型检查基于静态类型规则:编译器只知道my_val % 2的结果类型是u32,不会自动推导这个表达式的实际可能取值范围——它会严格要求match覆盖该类型的所有可能值,哪怕某些值在逻辑上不可能出现。
解决方法
要让代码通过编译,只需添加一个通配符分支捕获所有逻辑上不可能的情况:
fn main () { let my_val: u32 = 42; match my_val % 2 { 0 => println!("We're even now"), 1 => println!("Well, that's odd"), _ => unreachable!("u32模2的结果不可能是0或1之外的值"), } }
这里的unreachable!()宏既满足了编译器的覆盖性要求,又能在意外情况发生时触发panic提示错误,明确标记该分支在正常逻辑下永远不会执行。
内容的提问来源于stack exchange,提问作者Olivier Lasne
相关产品推荐
相关产品推荐

