面试题答案
一键面试fn main() {
let res: Result<Vec<i32>, &str> = Ok(vec![1, 2, 3]);
let sum = res
.map(|vec| vec.into_iter().map(|num| num * 2).collect::<Vec<i32>>())
.map(|vec| vec.iter().sum::<i32>());
match sum {
Ok(sum) => println!("Sum: {}", sum),
Err(err) => println!("Error: {}", err),
}
}
解释:
map
第一个调用:res.map(|vec| vec.into_iter().map(|num| num * 2).collect::<Vec<i32>>())
:map
方法是Result
类型的一个方法。如果res
是Ok
,它会对Ok
中的值(即Vec<i32>
)进行操作,这里的操作是将Vec<i32>
中的每个元素加倍。- 首先使用
into_iter
将Vec
转换成迭代器,然后使用map
对迭代器中的每个元素num
乘以2
。最后通过collect
方法将迭代器重新收集成一个Vec<i32>
。 - 如果
res
是Err
,map
方法会直接返回这个Err
值,不会执行闭包中的代码。
map
第二个调用:.map(|vec| vec.iter().sum::<i32>())
:- 再次使用
map
方法。如果上一步的map
调用返回的是Ok
(即加倍后的Vec<i32>
),这个map
会对加倍后的Vec<i32>
进行操作,计算其所有元素的总和。 vec.iter()
创建一个Vec
的迭代器,sum::<i32>()
方法将迭代器中的所有元素求和,并指定结果类型为i32
。- 如果上一步的
map
调用返回的是Err
,这个map
方法同样会直接返回这个Err
值,不会执行闭包中的代码。
- 再次使用
最后通过 match
语句来处理最终的 Result
,如果是 Ok
则打印总和,如果是 Err
则打印错误信息。