MST

星途 面试题库

面试题:Rust中Result类型的链式操作

给定一个`Result`类型的变量`res`,它可能包含一个`Vec<i32>`,请使用`Result`的链式调用方法,将这个`Vec<i32>`中的每个元素加倍,然后计算加倍后所有元素的总和。如果`res`是`Err`,则返回错误而不进行任何计算。请编写代码实现这一过程,并解释每个链式调用方法的作用。
13.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
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),
    }
}

解释

  1. map 第一个调用
    • res.map(|vec| vec.into_iter().map(|num| num * 2).collect::<Vec<i32>>())
      • map 方法是 Result 类型的一个方法。如果 resOk,它会对 Ok 中的值(即 Vec<i32>)进行操作,这里的操作是将 Vec<i32> 中的每个元素加倍。
      • 首先使用 into_iterVec 转换成迭代器,然后使用 map 对迭代器中的每个元素 num 乘以 2。最后通过 collect 方法将迭代器重新收集成一个 Vec<i32>
      • 如果 resErrmap 方法会直接返回这个 Err 值,不会执行闭包中的代码。
  2. 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 则打印错误信息。