Functional programming 带谓词的锈映射
在Rust中,是否存在基于我可以选择的条件停止迭代的类似映射的等价物 我想迭代一个向量,在我这样做时对每个元素调用一个函数并存储结果,但是如果函数返回值满足条件,就停止迭代 迭代伪代码示例:Functional programming 带谓词的锈映射,functional-programming,rust,Functional Programming,Rust,在Rust中,是否存在基于我可以选择的条件停止迭代的类似映射的等价物 我想迭代一个向量,在我这样做时对每个元素调用一个函数并存储结果,但是如果函数返回值满足条件,就停止迭代 迭代伪代码示例: results = [] for elem in vec: result = foo(elem) if result is None break results.push(result) 我可以通过改变初始状态来实现这一笨拙的等价物,但(AFAIK)它仍然会在每个元
results = []
for elem in vec:
result = foo(elem)
if result is None
break
results.push(result)
我可以通过改变初始状态来实现这一笨拙的等价物,但(AFAIK)它仍然会在每个元素上迭代:
扫描变量的类锈伪代码:
results = vec.iter().scan(false, |fail, elem|
if *fail
return None
result = foo(elem)
if result is None
*fail = true
return result
).collect()
如果我正确阅读了问题,您应该能够使用:
results = vec.iter().take_while(|v| foo(v)).collect()
Rust中的迭代器是惰性计算的。本质上,对
collect
的调用强制每次计算迭代器的每个元素。这意味着,一旦某个元素在take\u while
中的谓词失败,就不会从初始迭代器中读取更多的元素,更不用说通过map
当谓词为真时,它不会生成元素,而不是在谓词为真时生成foo(element)
,这就是我想要的。干杯
results = vec.iter().map(foo).take_while(|e| e.is_some()).collect()