Rust中match表达式取模运算的模式匹配优化方案咨询
解决Rust中i32奇偶划分的匹配简洁性与覆盖率问题
针对你遇到的编译器要求完整匹配模2结果、但不想用_分支影响覆盖率的问题,以下是几种更优的处理方案:
1. 直接使用标准库的奇偶判断方法
最简洁直观的方式,依赖i32自带的is_even/is_odd方法,完全避免模运算的符号和匹配问题:
use itertools::{Either, Itertools}; // 0.14.0; fn print(nums: &Vec<i32>) { for num in nums { print!("{}, ", num); } println!(); } fn main() { let nums = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; print(&nums); let (evens, odds): (Vec<_>, Vec<_>) = nums.iter() .partition_map(|num| { if num.is_even() { Either::Left(num) } else { Either::Right(num) } }); print(&nums); print(&evens); print(&odds); }
2. 用unreachable!替代通配符分支
如果坚持使用模运算,unreachable!宏会明确告诉编译器该分支永远不会执行,覆盖率工具也会忽略这个分支:
use itertools::{Either, Itertools}; // 0.14.0; fn print(nums: &Vec<i32>) { for num in nums { print!("{}, ", num); } println!(); } fn main() { let nums = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; print(&nums); let (evens, odds): (Vec<_>, Vec<_>) = nums.iter() .partition_map(|num| match num % 2 { 0 => Either::Left(num), 1 | -1 => Either::Right(num), _ => unreachable!("i32对2取模的结果只能是-1、0、1") }); print(&nums); print(&evens); print(&odds); }
3. 封装奇偶判断辅助函数
把模运算的判断逻辑封装到函数里,让主逻辑更清晰,同时避免重复代码:
use itertools::{Either, Itertools}; // 0.14.0; fn is_even(num: &i32) -> bool { num % 2 == 0 } fn print(nums: &Vec<i32>) { for num in nums { print!("{}, ", num); } println!(); } fn main() { let nums = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; print(&nums); let (evens, odds): (Vec<_>, Vec<_>) = nums.iter() .partition_map(|num| { if is_even(num) { Either::Left(num) } else { Either::Right(num) } }); print(&nums); print(&evens); print(&odds); }
其中第一种方案最推荐,标准库方法不仅简洁,还完全规避了模运算的符号细节,可读性和健壮性都更强。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

