如何在Rust中使用ControlFlow与try_fold时避免不可反驳模式并获取值?
解决方案
有两种常用方法可以避免编写那种冗余的不可反驳模式匹配:
方法一:利用ControlFlow::into_inner()合并结果
如果Break和Continue携带的值类型相同,可先调用into_inner()将ControlFlow转为Result,再通过unwrap_or_else直接提取内部值:
let result = values .iter() .try_fold(0, |previous, ¤t| match previous { 0 => ControlFlow::Continue(1), 1 => ControlFlow::Continue(2), _ => ControlFlow::Break(3), }); let value = result.into_inner().unwrap_or_else(|v| v);
into_inner()会把Continue(v)转为Ok(v)、Break(v)转为Err(v),由于两者值类型一致,unwrap_or_else可以直接统一提取出目标值。
方法二:封装自定义辅助函数
如果需要更直观的复用写法,可以封装一个简单的提取函数,只需要写一次就能重复调用:
fn extract_control_flow_value<T>(cf: ControlFlow<T, T>) -> T { match cf { ControlFlow::Continue(v) => v, ControlFlow::Break(v) => v, } } // 使用示例 let value = extract_control_flow_value( values.iter().try_fold(0, |previous, ¤t| match previous { 0 => ControlFlow::Continue(1), 1 => ControlFlow::Continue(2), _ => ControlFlow::Break(3), }) );
内容的提问来源于stack exchange,提问作者mdmundo
相关产品推荐
相关产品推荐

