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
相关产品推荐
相关产品推荐

