You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:22:41