You need to enable JavaScript to run this app. Rust中如何将Option类型的Vec转换为存储元素引用的普通Vec?
优惠活动
大模型
产品
解决方案
定价
更多

Rust中如何将Option类型的Vec转换为存储元素引用的普通Vec?

最优实现方案

Rust 标准库的Option类型本身实现了迭代器特性,你可以直接使用flatten()方法一步完成过滤None、取出内部元素的操作,完全不需要手动调用is_some()和unwrap(),既简洁又避免了人为写错导致panic的风险:

struct Dummy {
    foo: i32
}

fn main() {
    let a = Box::new(Dummy {foo: 42});
    let b = Box::new(Dummy {foo: 69});
    let c = Box::new(Dummy {foo: 420});

    let bar = vec![Some(a), None, Some(b), None, Some(c)];

    // 一行完成转换,无需filter+map+unwrap组合
    let only_elements: Vec<&Box<Dummy>> = bar.iter().flatten().collect();

    for el in only_elements {
        println!("{}", el.foo);
    }
}

原理解释

  • 当你对&Option<T>类型的迭代器调用flatten()时,它会自动跳过所有None元素,并且把Some(&T)里的&T直接取出来,刚好匹配你需要的元素引用类型
  • 如果你后续不需要保留原bar向量的所有权,也可以直接调用into_iter()消费原向量,拿到Box<Dummy>的所有权:
// 消费原bar向量,拿到元素所有权的版本
let only_elements: Vec<Box<Dummy>> = bar.into_iter().flatten().collect();

内容的提问来源于stack exchange,提问作者Nerpson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 17:54:02