fn main() {
let people_info: Vec<String> = vec![
"Alice,25,Engineer".to_string(),
"Bob,15,Student".to_string(),
"Charlie,30,Doctor".to_string(),
];
let result: Result<Vec<(String, u32, String)>, &'static str> = people_info
.into_iter()
.filter_map(|info| {
let parts: Vec<&str> = info.split(',').collect();
if parts.len() != 3 {
return None;
}
let age = parts[1].parse::<u32>().ok()?;
if age < 18 {
return None;
}
Some((parts[0].to_string(), age, parts[2].to_string()))
})
.collect();
match result {
Ok(parsed_people) => {
println!("Parsed people: {:?}", parsed_people);
}
Err(e) => {
println!("Error: {}", e);
}
}
}
- 代码说明:
- 首先定义了一个
people_info
的Vec<String>
,包含一些人的信息。
- 使用
into_iter
将Vec<String>
转换为迭代器。
filter_map
方法对每个字符串进行处理,先使用split(',')
将字符串按逗号分割成&str
的Vec
。
- 检查分割后的部分数量是否为3,如果不是则返回
None
。
- 尝试将年龄部分解析为
u32
,如果解析失败返回None
。
- 检查年龄是否小于18岁,如果是则返回
None
。
- 如果所有检查通过,将解析出的姓名、年龄和职业以
(String, u32, String)
的形式返回。
- 最后使用
collect
将迭代器收集为Result<Vec<(String, u32, String)>, &'static str>
,并通过match
处理结果。如果成功,打印解析后的人员信息;如果失败,打印错误信息。