迭代器的谓词返回 Result<bool, E>,如何停止迭代并返回错误

Iterator's predicate returns Result<bool, E>, how do I stop iteration and return the error

提问人:Tom Huntington 提问时间:11/14/2023 最后编辑:Tom Huntington 更新时间:11/14/2023 访问量:56

问:

type E = String;

fn helper() -> Result<char, E> {
    let pred = |x| -> Result<bool, E> {
        if x % 3 {
            Ok(x % 2)
        } else {
            Err("error".to_string())
        }
    };
    let it = "abcde".chars().filter(pred);
    return it.next()
}

你如何解决这个问题?捕获对 ?Option<E>

这是类似问题的解决方案,但对于 Iterator::map 返回 Result::Err 时如何停止迭代并返回错误?map

Rust 迭代器

评论

2赞 Chayim Friedman 11/14/2023
pred()需要一个整数,但迭代器是 s。char

答:

1赞 Chayim Friedman 11/14/2023 #1

您可以使用 filter_map()

let mut it = "abcde".chars().filter_map(|item| match pred(item) {
    Ok(should_return) => should_return.then_some(Ok(item)),
    Err(err) => Some(Err(err)),
});
return it.next();

或者find_map(),如果你想要的只是:next()

"abcde".chars().find_map(|item| match pred(item) {
    Ok(should_return) => should_return.then_some(Ok(item)),
    Err(err) => Some(Err(err)),
})

评论

0赞 Tom Huntington 11/15/2023
怎么样?我认为最好的解决方案是创建一个新的迭代器,从 rust 标准库复制粘贴代码skip_while