rust - 计数选项集合中出现次数的惯用方式

标签 rust idioms

我想计算选项集合中某个值出现的次数。

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

rust 的惯用方法是什么?

最佳答案

您可以使用flatten摆脱None并解包Some(...)值。

代码:

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

要计算None,您可以简单地使用以下代码:
let none_count = v.len() - v.iter().flatten().count();

Playground

为什么Flatten适用于Option

来自@E_net4 's comment:由于Option实现了IntoIterator,因此它的行为类似于空迭代器或具有单个元素的迭代器。
  • Iterator的空None
  • 带有单个元素的Iterator Some(...)
  • 关于rust - 计数选项集合中出现次数的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61928390/

    相关文章:

    python - 数组的所有排列,其中数组中的每个元素必须按0到n之间的范围递增

    error-handling - 修改后的Rust Book猜游戏查询

    c# - 是否有 C# 习惯用法可以创建然后添加到集合中?

    php - 交响乐框架;存储用户角色的惯用方式

    rust - 这是因为互斥量没有释放吗?

    rust - 调用iter()。sum(): the trait bound `f64: std::iter::Sum<&std::vec::Vec<f64>>` is not satisfied时出错

    rust - 如何为特征实现指定引用生命周期?

    rust - 如何处理 HashMap 的值(可能)有多种类型传递给函数?

    c++ - 使用列名 vector 生成 sql 语句

    javascript - 如何为对象的键设置默认值?