Я хочу подсчитать количество вхождений значения в наборе параметров.
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()
Какой идиоматический способ сделать это в ржавчине?
Вы хотите также считать None?
извините, я выбрал упрощенный пример. Мой x - это структура, и мне нужно сравнить ее с переданным значением в rhs. Нравится x.is_some() && x.unwrap().value() == id
Меня не волнуют None
s
Вы можете использовать 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 работает для Option
s?
Из Комментарий @E_net4: Поскольку Option
реализует IntoIterator
, он может вести себя как пустой итератор или итератор с одним элементом.
Iterator
для None
Iterator
с одним элементом для Some(...)
что возвращает flatten
on None?
@pd176 удаляет значения None
из итератора, такое поведение существует для Option
Iterator. (То же самое для Err
значений Result
Iterator)
@ pd176 flatten
работает здесь, потому что Option
может вести себя как итератор с 0 или 1 элементом (элементами); он реализует IntoIterator
.
@E_net4 спасибо, это лучшее объяснение, я отредактирую ответ, когда смогу.
Вы были рядом:
.filter(|&x| x == Some(1))