计数选项集合中出现次数的惯用方式 [英] Idiomatic way to count occurrences in a collection of Options
问题描述
我想统计一个选项集合中某个值出现的次数.
let v = vec![Some(1),Some(1),Some(3),None];v.iter().filter(| Some(x)| x ==& 1).数数();
这样做会产生 refutable模式未覆盖
错误,这是有道理的.
我通过这样做解决了这个问题
v.iter().filter(| x | x.is_some()&& x.unwrap()==& 1).数数()
在锈病中惯用的方式是什么?
您可以使用 flatten
摆脱 None
并展开 Some(...)
值.
代码:
let one_count = v.iter().flatten().filter(| x | ** x == 1).count();
要计数 None
,您可以简单地使用以下代码:
让none_count = v.len()-v.iter().flatten().count();
游乐场 >
为什么Flatten适用于 Option
s?
来自 @ E_net4的评论:由于 Option
实现了 IntoIterator
,因此它的行为就像一个空的迭代器或具有单个元素的迭代器.
- 空
Iterator
表示None
-
迭代器
,带有单个元素,用于Some(...)
I want to count number of occurrences of a value in a collection of Options.
let v = vec![Some(1), Some(1), Some(3), None];
v.iter()
.filter(|Some(x)| x == &1)
.count();
Doing this gives refutable pattern not covered
error which makes sense.
I got around this by doing
v.iter()
.filter(|x| x.is_some() && x.unwrap() == &1)
.count()
What's the idiomatic way to do this in rust?
You can use flatten
to get rid of None
and unwrap the Some(...)
values.
Code:
let one_count = v.iter().flatten().filter(|x| **x == 1).count();
To count None
s you can simply use this:
let none_count = v.len() - v.iter().flatten().count();
Why Flatten works for Option
s ?
From @E_net4 's comment: Since Option
implements IntoIterator
it can behave like an empty iterator or iterator with a single element .
- Empty
Iterator
forNone
Iterator
with single element forSome(...)
这篇关于计数选项集合中出现次数的惯用方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!