将空的Vec转换为None是否有惯用的方法?

6

我在一个filter_map中使用了闭包,最终以这个if语句结束:

if my_vec.is_empty() {
    None
} else {
    Some(my_vec)
}

有没有简单的方法将一个空的Vec转换成NoneSome(my_vec)

5
我不知道有这样的事情。你为什么想要这个?个人而言,我通常使用一个长度为0的向量来表示值的缺失。 - nlta
2
relevant - user2722968
2个回答

9
impl bool 中有一个名为 then 的函数,可以将 bool 类型转换为 option 类型。
let opt = (!my_vec.is_empty()).then(|| my_vec);

还有在夜间版中可用的then_some

#![feature(bool_to_option)] 
fn main() {
    let my_vec: Vec<i32> = vec![];
    let _opt = (!my_vec.is_empty()).then_some(my_vec);
}

2

既然您提到了filter_map,那么考虑更改如何呢?

sth.filter_map(|item| {
  let my_vec = some_operation(item);
  if my_vec.is_empty() {
    None
  } else {
    Some(my_vec)
  }
})

to

sth
.map(|item| some_operation(item))
.filter( |vec| !vec.is_empty())

根据官方文档,Rust的迭代器是零成本抽象,因此您可以在不增加额外成本的情况下这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接