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
相关产品推荐
相关产品推荐

