【问题标题】:Rust map with predicate带有谓词的 Rust 映射
【发布时间】:2014-11-22 00:09:29
【问题描述】:

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

【问题讨论】:

    标签: functional-programming rust


    【解决方案1】:
    results = vec.iter().map(foo).take_while(|e| e.is_some()).collect()
    

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

    【讨论】:

    • 是的,这就是我想要的。干杯。
    【解决方案2】:

    如果我没有正确阅读问题,您应该可以使用 Iterator::take_while 来解决这个问题:

    results = vec.iter().take_while(|v| foo(v)).collect()
    

    【讨论】:

    • 不会在谓词为真时产生 元素,而不是在谓词为真时产生 foo(element)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多