在Rust中,是否存在基于我可以选择的条件停止迭代的类似地图的等价物?
我想迭代一个向量,在我这样做时调用每个元素上的函数并存储结果,但是如果函数返回值满足条件,则停止迭代
迭代伪代码示例:
results = []
for elem in vec:
result = foo(elem)
if result is None
break
results.push(result)
我可以通过改变初始状态来实现与scan相当的笨拙,但是(AFAIK)它仍将迭代每个元素:
扫描变体的类似Rust的伪代码:
results = vec.iter().scan(false, |fail, elem|
if *fail
return None
result = foo(elem)
if result is None
*fail = true
return result
).collect()
答案 0 :(得分:4)
results = vec.iter().map(foo).take_while(|e| e.is_some()).collect()
Rust中的迭代器被懒惰地评估了。实质上,对collect
的调用会强制一次一个地评估迭代器的每个元素。这意味着只要某个元素在take_while
中失败了谓词,就不会从初始迭代器中读取更多元素,更不用说通过map
。
答案 1 :(得分:0)
如果我正确地阅读了问题,您应该可以使用Iterator::take_while:
results = vec.iter().take_while(|v| foo(v)).collect()