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

pd1*_*176 4 idiomatic rust

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

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

这样做会refutable pattern not covered产生有意义的错误。

我通过这样做解决了

v.iter()
 .filter(|x| x.is_some() && x.unwrap() == &1)
 .count()
Run Code Online (Sandbox Code Playgroud)

锈蚀的惯用方式是什么?

Öme*_*den 9

您可以flatten用来删除None和解包Some(...)值。

码:

let one_count = v.iter().flatten().filter(|x| **x == 1).count();
Run Code Online (Sandbox Code Playgroud)

要计算Nones,您可以简单地使用以下代码:

let none_count = v.len() - v.iter().flatten().count();
Run Code Online (Sandbox Code Playgroud)

操场

为什么Flatten为Options工作?

来自@ E_net4的评论:自Option实现以来,IntoIterator它的行为就像一个空的迭代器或具有单个元素的迭代器。

  • IteratorNone
  • Iterator 与单个元素 Some(...)