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

Rust中如何从match语句返回多值?优化枚举返回方案

Rust输入验证流程的优化问题

我正在通过完成Advent of Code过往题目深入学习Rust。处理其中一题时,我写了一个验证文件输入的函数,用返回枚举来控制程序流程:

enum ValidatorReturns {
    BRK,
    CNT,
    VALUES(i32, i32)
}

fn validate_inputs(contents: &mut String) -> ValidatorReturns {...}

fn pt2() -> Result<(), std::io::Error> {
    let file = File::open("input.input")?;
    let mut reader = BufReader::new(file);
    ...
    loop {
        let mut contents = String::new();
        let _ = reader.read_line(&mut contents)?;
        let mut val1: i32 = 0;  // <-- 出现未读取警告
        let mut val2: i32 = 0;  // <-- 同上
        let _ = match validate_inputs(&mut contents) {
            ValidatorReturns::BRK => break,
            ValidatorReturns::CNT => continue,
            ValidatorReturns::VALUES(tval1, tval2) => {
                val1 = tval1; // 临时变量命名不够优雅
                val2 = tval2;
            }
        };
        ...
    }
    ...
}

这种写法能运行,但存在几个问题:

  • 会触发未读取变量的警告
  • 临时变量命名不够优雅,整体写法繁琐

我尝试过几种改进思路,但都没成功:

  • 受Python习惯影响,想从match语句返回val1, val2元组并解包,但没找到可行方法
  • 尝试在match分支内声明变量(比如let val1 = tval1;),但作用域问题导致后续代码报未声明变量的编译错误
  • 考虑过返回多个布尔值分别标记BRK、CNT状态,再加上两个验证值,但这种方式繁琐且不符合Rust风格

查阅文档后,我重构了代码,用结构体作为枚举成员来存储值:

struct ValidatedValues {
    val1: i32,
    val2: i32
}

enum ValidatorReturns {
    BRK,
    CNT,
    VALUES(ValidatedValues)
}

fn validate_inputs(contents: &mut String) -> ValidatorReturns {...}

fn pt2_enum() -> Result<(), std::io::Error> {
    let file = File::open("input.input")?;
    let mut reader = BufReader::new(file);
    ...
    loop {
        let mut contents = String::new();
        let _ = reader.read_line(&mut contents)?;
        let valvalues = match validate_inputs(&mut contents) {
            ValidatorReturns::BRK => break,
            ValidatorReturns::CNT => continue,
            ValidatorReturns::VALUES(val) => val  // <-- 仍觉繁琐
        };
        ...
    }
    ...
}

这似乎是Rust里的常见模式,但每次必须指定枚举成员的写法还是不够优雅,和Rust其他简洁的语法不太匹配。我想知道:

  • 使用结构体作为枚举成员是返回多值的最佳方案吗?
  • 有没有其他更简洁、更符合Rust风格的实现思路?

内容的提问来源于stack exchange,提问作者user23346441

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 15:23:26