【问题标题】:Is there an idiomatic way to convert empty Vec to None? [duplicate]有没有一种惯用的方法可以将空的 Vec 转换为 None? [复制]
【发布时间】:2021-12-31 22:29:24
【问题描述】:

我在filter_map 中有一个以这个 if 语句结尾的闭包:

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

有没有一种简单的方法可以将空的Vec 转换为NoneSome(my_vec)

【问题讨论】:

  • 我不知道。你想要这个有理由吗?就我个人而言,我通常使用 0 长度的 vec 来表示没有值。

标签: rust


【解决方案1】:

impl bool 中有一个名为 then 的函数,可将布尔值转换为选项。

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

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

    根据官方文档,Rust 的迭代器是零成本的抽象,所以你可以在没有额外成本的情况下做到这一点。

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 2021-11-13
      • 1970-01-01
      • 2022-09-24
      • 2012-04-30
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多