Functional programming 带谓词的锈映射

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)它仍然会在每个元

在Rust中,是否存在基于我可以选择的条件停止迭代的类似映射的等价物

我想迭代一个向量,在我这样做时对每个元素调用一个函数并存储结果,但是如果函数返回值满足条件,就停止迭代

迭代伪代码示例:

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()