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

tim*_*ree 2 rust

我有一些像这样的矢量

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)];
Run Code Online (Sandbox Code Playgroud)

我想这将返回一个功能Noneexample1,但将返回Some([5, 19, 4, 6])example2.

换句话说,我想要一个函数,None如果有任何选项None,则返回,但是如果所有选项都Some将它们全部展开并返回Some.

tim*_*ree 7

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

let output = vec.into_iter().collect::<Option<Vec<_>>
Run Code Online (Sandbox Code Playgroud)

或使用类型注释

let output: Option<Vec<_>> = vec.into_iter().collect();
Run Code Online (Sandbox Code Playgroud)

请参阅它用于s collect()FromIterator特征实现Option.

  • 请注意,也有 Result 的实现。 (2认同)