如何用迭代器重写含闭包返回逻辑的循环?
用迭代器重构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
相关产品推荐
相关产品推荐

