Идиоматичный способ подсчета вхождений в коллекции параметров - PullRequest
4 голосов
/ 03 мая 2019

Я хочу посчитать количество вхождений значения в коллекцию опций.

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 Ответ

8 голосов
/ 03 мая 2019

Вы можете использовать flatten, чтобы избавиться от None и развернуть значения Some(...).

Код:

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

Для подсчета None с вы можете просто использовать это:

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

Детская площадка

Почему Flatten работает для Option с?

Из комментария @ E_net4 : поскольку Option реализует IntoIterator, он может вести себя как пустой итераторили итератор с одним элементом.

  • Пусто Iterator для None
  • Iterator с одним элементом для Some(...)
...