带有谓词的 Rust 映射

Isk*_*rak 3 functional-programming rust

在 Rust 中,是否有类似地图的等价物可以根据我可以选择的条件停止迭代?

我想迭代一个向量,在每个元素上调用一个函数并存储结果,但如果函数返回值满足条件,则停止迭代

迭代伪代码示例:

results = []
for elem in vec:
    result = foo(elem)
    if result is None
        break
    results.push(result)
Run Code Online (Sandbox Code Playgroud)

我可以通过改变初始状态来实现与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()
Run Code Online (Sandbox Code Playgroud)

DK.*_*DK. 6

results = vec.iter().map(foo).take_while(|e| e.is_some()).collect()
Run Code Online (Sandbox Code Playgroud)

Rust 中的迭代器是惰性求值的。本质上,调用collect强制迭代器的每个元素一次评估一个。这意味着一旦某个元素使 in 的谓词失败take_while,就不会从初始迭代器中读取更多元素,更不用说通过 了map