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

如何在Rust中使用ControlFlow与try_fold时避免不可反驳模式并获取值?

解决方案

有两种常用方法可以避免编写那种冗余的不可反驳模式匹配:

方法一:利用ControlFlow::into_inner()合并结果

如果Break和Continue携带的值类型相同,可先调用into_inner()将ControlFlow转为Result,再通过unwrap_or_else直接提取内部值:

let result = values
    .iter()
    .try_fold(0, |previous, &current| 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, &current| match previous {
        0 => ControlFlow::Continue(1),
        1 => ControlFlow::Continue(2),
        _ => ControlFlow::Break(3),
    })
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:35:25