MST

星途 面试题库

面试题:Rust Option枚举在异步编程空值处理中的深度优化

在一个异步Rust程序中,有一个异步函数`fetch_data`,它返回`Result<Option<Vec<u8>>, Error>`。请实现一个函数,该函数能够处理这个异步返回值,若`Option`为空或`Result`为错误,都进行合适的日志记录,并最终返回一个默认的`Vec<u8>`。要求代码尽可能高效,并且要考虑异步执行过程中的资源管理和性能优化。
24.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::error::Error;
use std::fmt;
use std::sync::Arc;
use log::{info, error};
use tokio::sync::Mutex;

// 模拟错误类型
#[derive(Debug)]
struct MyError;

impl fmt::Display for MyError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "My custom error")
    }
}

impl Error for MyError {}

// 模拟异步函数
async fn fetch_data() -> Result<Option<Vec<u8>>, MyError> {
    // 模拟异步操作
    tokio::time::sleep(std::time::Duration::from_secs(1)).await;
    Ok(Some(vec![1, 2, 3]))
}

// 处理异步返回值的函数
async fn handle_fetch_data() -> Vec<u8> {
    match fetch_data().await {
        Ok(Some(data)) => data,
        Ok(None) => {
            info!("Option is None, using default value");
            Vec::new()
        },
        Err(e) => {
            error!("Error occurred: {}", e);
            Vec::new()
        }
    }
}

你可以这样调用这个函数:

#[tokio::main]
async fn main() {
    let result = handle_fetch_data().await;
    println!("Final result: {:?}", result);
}

解释:

  1. fetch_data 是模拟的异步函数,返回 Result<Option<Vec<u8>>, MyError>
  2. handle_fetch_data 使用 match 表达式来处理 fetch_data 的返回值。如果是 Ok(Some(data)),则直接返回数据;如果是 Ok(None),记录日志并返回默认的空 Vec<u8>;如果是 Err(e),记录错误日志并返回默认的空 Vec<u8>
  3. main 函数中,通过 tokio::main 宏来异步执行 handle_fetch_data 函数,并打印最终结果。

这样的实现考虑了异步执行过程中的资源管理和性能优化,match 表达式是一种高效处理 ResultOption 的方式,并且使用 log 库进行日志记录。同时,tokio::main 宏确保异步代码在合适的运行时环境中执行。