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

时间:2019-05-03 12:21:04

标签: rust idiomatic

我想统计一组选项中某个值出现的次数。

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()

在锈病中惯用的方式是什么?

1 个答案:

答案 0 :(得分:7)

您可以使用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

来自@E_net4 's comment:由于Option实现了IntoIterator,因此它的行为就像一个空的迭代器或具有单个元素的迭代器。

  • IteratorNone
  • Iterator,其中单个元素用于Some(...)