你如何处理 Rust filter() 中的错误?

bru*_*olf 2 error-handling iterator filter rust

我想使用一个可能返回Err结果的过滤器函数,并将其冒泡到包含函数中:

mycoll.into_iter()
  .filter(|el| {
    if el == "bad" {
      Err(MyError)
    } else {
      Ok(el < "foo")
    }
  })
Run Code Online (Sandbox Code Playgroud)

我找到了一个关于如何处理这种情况的很好的解释map()(使用.collect::<Result<...>>()):当 Iterator::map 返回 Result::Err 时,如何停止迭代并返回错误?但我无法获得类似的解决方案来为filter().

这里的惯用解决方案是什么?

Dan*_*all 5

我可能会建议使用filter_map. 您的示例如下所示:

mycoll.into_iter()
  .filter_map(|el| {
    if el == "bad" {
      Some(Err(MyError))
    } else if el < "foo" {
      Some(Ok(el))
    } else {
      None
    }
  })
Run Code Online (Sandbox Code Playgroud)