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

如何用迭代器重写含闭包返回逻辑的循环?

用迭代器重构Rust函数替代for循环

原循环实现

原函数通过for循环遍历数组,遇到大于20的元素立即返回false,否则累加元素,最后判断总和是否大于10:

fn with_loop() -> bool {
    let foo = [1, 2, 25, 4, 5];
    let mut sum = 0;
    for bar in foo {
        if bar > 20 {return false;}
        sum += bar;
    }
    sum > 10
}

尝试的迭代器写法(存在返回问题)

尝试用inspect检测元素,但无法在闭包中让外层函数提前返回,且即便检测到不符合条件的元素,迭代仍会继续完成求和,不符合原逻辑:

fn functional_programming() -> bool {
    let foo = [1, 2, 25, 4, 5];
    let sum: i32 = foo
        .into_iter()
        .inspect(|bar_ptr| {
            if *bar_ptr > 20 {
                // functional_programming() returns false;
                print!("I want to return false");
            }
        })
        .sum();
    sum > 10
}

满足约束的迭代器实现

使用try_fold方法可以在迭代过程中提前终止并返回结果,完全满足「仅扫描一次、不收集、无过度嵌套」的约束:

fn with_iterator() -> bool {
    let foo = [1, 2, 25, 4, 5];
    
    foo.into_iter()
        .try_fold(0, |sum, bar| {
            if bar > 20 {
                Err(false)
            } else {
                Ok(sum + bar)
            }
        })
        .map_or(false, |sum| sum > 10)
}

实现说明

  • try_fold允许在迭代时通过返回Err提前终止流程,对应原逻辑中“遇到大于20的元素立即返回false”的需求。
  • 迭代仅执行一次,无需收集元素或重新开启迭代器,逻辑简洁无过度嵌套。
  • map_or处理最终结果:若迭代中触发Err(false)则直接返回false;若迭代完成得到总和,则判断总和是否大于10并返回对应布尔值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:52:36