MST

星途 面试题库

面试题:Rust Option枚举在链式操作中的优化使用

给定一系列可能返回Option值的函数调用,例如 `fn1()`、`fn2()`、`fn3()`,每个函数的返回值可能为 `Some(T)` 或 `None`。要求通过链式调用,使得只要有一个函数返回 `None`,整个操作链就立即返回 `None`,并且最终将所有 `Some(T)` 中的 `T` 类型值累加起来(假设 `T` 实现了 `Add` 特性)。请编写相应的Rust代码实现该功能,并解释你使用的Option枚举相关方法的原理。
39.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn fn1() -> Option<i32> {
    Some(1)
}

fn fn2() -> Option<i32> {
    Some(2)
}

fn fn3() -> Option<i32> {
    Some(3)
}

fn main() {
    let result = fn1()
      .and_then(|x| fn2().map(|y| x + y))
      .and_then(|xy| fn3().map(|z| xy + z));

    match result {
        Some(sum) => println!("The sum is: {}", sum),
        None => println!("One of the functions returned None"),
    }
}

Option枚举相关方法原理

  1. and_then方法
    • and_thenOption枚举的一个方法。它接受一个闭包作为参数。
    • 如果Option的值是Some,则会调用闭包,并将Some内部的值作为参数传递给闭包。闭包返回的结果必须也是Option类型。如果闭包返回Someand_then会返回这个Some;如果闭包返回Noneand_then也会返回None
    • 如果Option的值是Noneand_then不会调用闭包,直接返回None。这就实现了只要有一个函数返回None,整个操作链就立即返回None的需求。
  2. map方法
    • map也是Option枚举的方法。它接受一个闭包作为参数。
    • 如果Option的值是Some,则会调用闭包,并将Some内部的值作为参数传递给闭包,然后将闭包的返回值包装在Some中返回。如果Option的值是Nonemap不会调用闭包,直接返回None。这里使用map是为了对Some(T)中的T类型值进行累加操作,并保持Option类型。