如何使用迭代器重构循环。 (关闭归来)

问题描述 投票:0回答:1

我想重构一个函数并使用迭代器而不是 for 循环。我用下面要重构的演示代码举例说明了这个问题:

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
}

我想做类似下面的事情,问题是我当然无法从关闭中返回。

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
}

一些我不想协商的额外限制:

  1. 仅扫描一次可迭代对象
  2. 避免收集并重新打开迭代器
  3. 避免在回调中过多嵌套
rust functional-programming
1个回答
0
投票

.sum()
方法可以对
Result
对象求和:

fn functional_programming() -> bool {
    let foo = [1, 2, 25, 4, 5];
    let sum = foo.iter()
        .map(|i| if *i > 20 { Err(()) } else { Ok(*i) })
        .sum::<Result<i64, _>>();
    if let Ok(sum) = sum {
        return sum > 10;
    }
    false
}
© www.soinside.com 2019 - 2024. All rights reserved.