计算选项集合中出现次数的惯用方法

Idiomatic way to count occurrences in a collection of Options

我想计算一个值在选项集合中出现的次数。

let v = vec![Some(1), Some(1), Some(3), None];
v.iter()
 .filter(|Some(x)| x == &1)
 .count();

这样做会产生 refutable pattern not covered 错误,这是有道理的。

我通过

解决了这个问题
v.iter()
 .filter(|x| x.is_some() && x.unwrap() == &1)
 .count()

在 Rust 中执行此操作的惯用方法是什么?

您可以使用 flatten 删除 None 并展开 Some(...) 值。

代码:

let one_count = v.iter().flatten().filter(|x| **x == 1).count();

要计算 None 秒,你可以简单地使用这个:

let none_count = v.len() - v.iter().flatten().count();

Playground

为什么 Flatten 对 Option 有效?

来自 :由于 Option 实现了 IntoIterator,它的行为类似于空迭代器或具有单个元素的迭代器。

  • None
  • 清空 Iterator
  • Iterator Some(...)
  • 的单个元素