仅从选项向量中获取“Some”内部的惯用方法?
Idiomatic way to only get insides of `Some` from a vector of options?
我正在学习 Rust 并试图习惯使用 Result
s 和 Option
s。给定一个向量。如果我只想要没有错误的结果(或者 none 对于 Option
),是否有比下面更优雅的方式来做这件事,或者这是我想要的样板数量平时都要写吗?
我意识到在 map
中可以做很多更精细的事情,例如 unwrap_or_else
和 partition
好的结果远离坏的。
let optvec = vec![Some(1), None, Some(4), None];
let filtered = optvec.iter()
.filter(|q| q.is_some())
.map(|q| q.unwrap())
.collect::<Vec<i32>>();
您可以使用 filter_map
它只能 returns Somes 而不是 Nones。
let optvec = vec![Some(1), None, Some(4), None];
let filtered: Vec<i32> = optvec.iter().filter_map(|f| *f).collect();
println!("{:?}", filtered);
>>> [1, 4]
在你的情况下,因为你没有做任何映射,我建议使用 flatten
ing 而不是 filter_map
ing。
在我看来,这更清楚,更容易解释。
let optvec = vec![Some(1), None, Some(4), None];
let filtered: Vec<i32> = optvec.iter().flatten().cloned().collect();
assert_eq!(filtered, &[1, 4]);
我正在学习 Rust 并试图习惯使用 Result
s 和 Option
s。给定一个向量。如果我只想要没有错误的结果(或者 none 对于 Option
),是否有比下面更优雅的方式来做这件事,或者这是我想要的样板数量平时都要写吗?
我意识到在 map
中可以做很多更精细的事情,例如 unwrap_or_else
和 partition
好的结果远离坏的。
let optvec = vec![Some(1), None, Some(4), None];
let filtered = optvec.iter()
.filter(|q| q.is_some())
.map(|q| q.unwrap())
.collect::<Vec<i32>>();
您可以使用 filter_map
它只能 returns Somes 而不是 Nones。
let optvec = vec![Some(1), None, Some(4), None];
let filtered: Vec<i32> = optvec.iter().filter_map(|f| *f).collect();
println!("{:?}", filtered);
>>> [1, 4]
在你的情况下,因为你没有做任何映射,我建议使用 flatten
ing 而不是 filter_map
ing。
在我看来,这更清楚,更容易解释。
let optvec = vec![Some(1), None, Some(4), None];
let filtered: Vec<i32> = optvec.iter().flatten().cloned().collect();
assert_eq!(filtered, &[1, 4]);