我正在努力找出ages所有Person有第二个名字的人。我能够使用filter和map分别进行如下操作,但我想知道我们是否可以filter_map在 Rust 中使用。
但我无法弄清楚。
struct Person {
pub first_name: String,
pub last_name: Option<String>,
pub age: i32,
}
fn main() {
let mut persons: Vec<Person> = Vec::new();
persons.push(Person {
first_name: "Asnim".to_string(),
last_name: None,
age: 1,
});
persons.push(Person {
first_name: "Fahim".to_string(),
last_name: Some("Ansari".to_string()),
age: 2,
});
persons.push(Person {
first_name: "Shahul".to_string(),
last_name: None,
age: 6,
});
persons.push(Person {
first_name: "Mujeeb".to_string(),
last_name: Some("Rahuman".to_string()),
age: 6,
});
let ages_of_people_with_second_name_using_seperate_filter_map: Vec<i32> = persons
.iter()
.filter(|p| p.last_name.is_some())
.map(|p| p.age)
.collect();
println!("{:?}", ages_of_people_with_second_name)
}
Run Code Online (Sandbox Code Playgroud)
Mur*_*llo 34
是的。如果您阅读了文档,filter_map您就会意识到您有多接近。甚至可以使用Option的地图来帮助您
喜欢:
let ages_of_people_with_second_name_using_seperate_filter_map: Vec<i32> = persons
.iter()
.filter_map(|p| p.last_name.map(|_| p.age))
.collect();
Run Code Online (Sandbox Code Playgroud)
或者更简单的方法,使用以下match模式:
let ages_of_people_with_second_name_using_seperate_filter_map: Vec<i32> = persons
.iter()
.filter_map(|p| match p.last_name {
Some(_) => Some(p.age),
None => None
})
.collect();
Run Code Online (Sandbox Code Playgroud)
Mas*_*inn 17
但我想知道我们是否可以在 Rust 中使用 filter_map 。
但我无法弄清楚。
您可以,但它在这里并不是非常有用,因为您要过滤的元素和您要映射的元素不相关。
.filter_map(|p| p.last_name.as_ref().map(|_|, p.age))
Run Code Online (Sandbox Code Playgroud)
因此,您最好保留当前版本。
通常的目的filter_map是避免类似的冗余(以及可能的成本)
.filter(|p| p.last_name.is_some()).map(|p| p.last_name.unwrap())
Run Code Online (Sandbox Code Playgroud)
在这种情况下
.filter_map(|p| p.last_name)
Run Code Online (Sandbox Code Playgroud)
更短、更简单、更高效。