Rust模式匹配多枚举分支共用逻辑时如何将变量绑定到字面量
解决方案
问题根因
Rust 要求使用|分隔的多模式匹配臂中,所有可选模式必须绑定完全相同的变量集合,不允许出现变量只在部分模式中存在的情况,所以你原来的写法无法通过编译,也不能直接在ESCAPE模式的匹配逻辑里隐式给byte赋值为0。
推荐实现方案
方案1:先匹配提取统一参数,再执行公共逻辑
这个方案最简洁,不需要额外抽取函数,适合公共逻辑代码量不大的场景:
// 先匹配把两种状态统一转换成(byte, count)元组 let (byte, count) = match self.state { RunState::ACCUMULATE(byte, count) => (byte, count), RunState::ESCAPE(count) => (0, count), _ => todo!() // 其他状态的处理逻辑 }; // 这里放原来的公共处理逻辑,完全不需要重复写
方案2:抽取公共逻辑为独立函数
如果公共逻辑代码量较大,推荐抽取为独立方法,两个匹配臂分别传入对应参数调用即可,类型可根据你实际的业务场景替换:
// 抽取公共处理方法 fn handle_state(&mut self, byte: u8, count: usize) { // 你的公共处理逻辑写在这里 } match self.state { RunState::ACCUMULATE(byte, count) => self.handle_state(byte, count), RunState::ESCAPE(count) => self.handle_state(0, count), _ => todo!() }
两种方案都完全避免了代码重复,也符合Rust的语法约束,性能上和你预期的同匹配臂写法没有任何差异。
内容的提问来源于stack exchange,提问作者Deric
相关产品推荐
相关产品推荐

