在 Rust 中忽略 None 值的正确样式

Mar*_*ala 4 rust

我是 Rust 新手,正在寻找好的样式选项来处理以下内容:

假设foo返回Option<i32>。我正在foo循环调用,如果它返回,None我只想继续前进。现在我发现自己在做类似的事情:

for _whatever in something {
  let data = foo();
  if data.is_none() {
    continue;
  }
  let data = data.unwrap();
  // other stuff
}
Run Code Online (Sandbox Code Playgroud)

还不错,可读性很好,但我忍不住觉得它可以更简洁。None这感觉像是一个非常常见的用例,我想知道我可能需要哪些其他选项来实现类似的目标,以及是否有公认的最佳实践以这种方式处理。

我尝试过match在 上使用语句和条件is_none,发现后者稍好一些。

pau*_*aul 7

if let可能会有帮助

for _whatever in something {
    if let Some(data) = foo() {
        // other stuff
    }
}
Run Code Online (Sandbox Code Playgroud)


dre*_*ato 5

您可以将其集成到迭代器中并将其展平以删除None值。

for data in something.into_iter().flat_map(|_| foo()) {
  // other stuff
}
Run Code Online (Sandbox Code Playgroud)