如何将Vec<Option<T>>转换为Option<Vec<T>>?

16

我有一些像这样的向量

let example1: Vec<Option<u64>> = vec![None, None, Some(2), Some(35)];
let example2: Vec<Option<u64>> = vec![Some(5), Some(19), Some(4), Some(6)];

我希望有一个函数,如果example1中有任何一个选项是None,则返回None,但如果example2中的所有选项都是Some,则展开它们并返回Some([5, 19, 4, 6])

换句话说,我想要一个函数,如果选项中有任何一个是None,则返回None,但如果所有选项都是Some,则解包它们并返回Some

1个回答

28

将其转换为迭代器并使用 .collect::<Option<Vec<_>>>()

let output = vec.into_iter().collect::<Option<Vec<_>>>();

或者使用类型注释

let output: Option<Vec<_>> = vec.into_iter().collect();

参见collect()以及它用于OptionFromIterator trait实现


2
请注意,Result 也有一个实现。 - Stargateur

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