提问人:Tom Huntington 提问时间:11/14/2023 最后编辑:Tom Huntington 更新时间:11/14/2023 访问量:56
迭代器的谓词返回 Result<bool, E>,如何停止迭代并返回错误
Iterator's predicate returns Result<bool, E>, how do I stop iteration and return the error
问:
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
答:
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
评论
pred()
需要一个整数,但迭代器是 s。char