与谓词的铁锈地图

时间:2014-11-22 00:09:29

标签: functional-programming rust

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

2 个答案:

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