Идиоматический способ подсчета вхождений в наборе параметров

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

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

Какой идиоматический способ сделать это в ржавчине?

Вы были рядом: .filter(|&x| x == Some(1))

E_net4 stands with Ukraine 03.05.2019 14:27

Вы хотите также считать None?

Ömer Erden 03.05.2019 14:32

извините, я выбрал упрощенный пример. Мой x - это структура, и мне нужно сравнить ее с переданным значением в rhs. Нравится x.is_some() && x.unwrap().value() == id

pd176 03.05.2019 14:33

Меня не волнуют Nones

pd176 03.05.2019 14:40
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
8
4
1 834
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Код:

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

Чтобы подсчитать None s, вы можете просто использовать это:

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

Игровая площадка

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

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

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

что возвращает flatten on None?

pd176 03.05.2019 15:09

@pd176 удаляет значения None из итератора, такое поведение существует для Option Iterator. (То же самое для Err значений Result Iterator)

Ömer Erden 03.05.2019 15:19

@ pd176 flatten работает здесь, потому что Option может вести себя как итератор с 0 или 1 элементом (элементами); он реализует IntoIterator.

E_net4 stands with Ukraine 03.05.2019 15:42

@E_net4 спасибо, это лучшее объяснение, я отредактирую ответ, когда смогу.

Ömer Erden 03.05.2019 15:47

Другие вопросы по теме