如何在 Rust 中将选项向量转换为简单向量?
How to convert a vector of options to a simple vector in Rust?
假设我有一个 Vec
包含一个名为 'Dummy'.
的结构的可选框
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)];
// This works, but it's a lot of calls for a single task.
let only_elements: Vec<&Box<Dummy>> = bar.iter()
.filter(|&el| el.is_some())
.map(|el| el.as_ref().unwrap())
.collect();
for el in only_elements {
println!("{}", el.foo);
}
}
如何以更漂亮的方式将此 Vec
选项转换为简单的 Vec
引用?
我写了我唯一能想到的方法,但对于一个对我来说微不足道的东西来说,它看起来有点乏味。
您可以使用 filter_map
。它至少从您拥有的内容中删除一行。您还可以在 collect::<Vec<_>>
中使用 turbofish
和下划线来指定类型,这样在您想要更改映射时无需显式声明类型。
let only_elements = bar.iter()
.filter_map(Option::as_ref)
.collect::<Vec<_>>();
您可以从 here 阅读更多关于 filter_map
的信息。
如@Masklinn 和 所述,Option
实现了 IntoIterator
,因此您也可以像对 Option
使用 flatten
作为 Option
20=].
let only_elements = bar.iter().flatten().collect::<Vec<_>>();
假设我有一个 Vec
包含一个名为 'Dummy'.
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)];
// This works, but it's a lot of calls for a single task.
let only_elements: Vec<&Box<Dummy>> = bar.iter()
.filter(|&el| el.is_some())
.map(|el| el.as_ref().unwrap())
.collect();
for el in only_elements {
println!("{}", el.foo);
}
}
如何以更漂亮的方式将此 Vec
选项转换为简单的 Vec
引用?
我写了我唯一能想到的方法,但对于一个对我来说微不足道的东西来说,它看起来有点乏味。
您可以使用 filter_map
。它至少从您拥有的内容中删除一行。您还可以在 collect::<Vec<_>>
中使用 turbofish
和下划线来指定类型,这样在您想要更改映射时无需显式声明类型。
let only_elements = bar.iter()
.filter_map(Option::as_ref)
.collect::<Vec<_>>();
您可以从 here 阅读更多关于 filter_map
的信息。
如@Masklinn 和 Option
实现了 IntoIterator
,因此您也可以像对 Option
使用 flatten
作为 Option
20=].
let only_elements = bar.iter().flatten().collect::<Vec<_>>();