计数选项集合中出现次数的惯用方式 [英] Idiomatic way to count occurrences in a collection of Options

查看:43
本文介绍了计数选项集合中出现次数的惯用方式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想统计一个选项集合中某个值出现的次数.

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

Playground

Why Flatten works for Options ?

From @E_net4 's comment: Since Option implements IntoIterator it can behave like an empty iterator or iterator with a single element .

  • Empty Iterator for None
  • Iterator with single element for Some(...)

这篇关于计数选项集合中出现次数的惯用方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆