MST
星途 面试题库

面试题:Rust 条件语句在异步编程中的优化使用

假设你正在使用Rust进行异步编程,有一个异步函数 `fetch_data` 会返回一个 `Result<Data, Error>`,其中 `Data` 是自定义的数据类型,`Error` 是自定义的错误类型。在另一个异步函数 `process_data` 中调用 `fetch_data`,使用条件语句来优雅地处理成功获取数据和发生错误的情况。如果获取数据成功,对数据进行一些复杂处理(比如解析JSON、根据特定规则过滤数据等),处理结果再根据不同条件返回不同的响应;如果发生错误,根据错误类型记录不同级别的日志(比如 `Error::NetworkError` 记录为警告日志,`Error::ParseError` 记录为错误日志),并返回合适的错误响应。请写出完整的代码结构和关键逻辑。
44.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use log::{error, warn};
use serde::Deserialize;

// 自定义数据类型
#[derive(Deserialize)]
struct Data {
    // 这里定义Data的字段
}

// 自定义错误类型
enum Error {
    NetworkError,
    ParseError,
    // 其他错误类型
}

// 模拟异步获取数据的函数
async fn fetch_data() -> Result<Data, Error> {
    // 实际实现获取数据逻辑并返回结果
    Err(Error::NetworkError)
}

// 处理数据的异步函数
async fn process_data() -> Result<String, String> {
    match fetch_data().await {
        Ok(data) => {
            // 复杂处理,比如解析JSON(假设data是JSON字符串)
            let parsed_data: Data = serde_json::from_str(&data).map_err(|_| Error::ParseError)?;
            // 根据特定规则过滤数据
            let filtered_data = filter_data(parsed_data);
            // 根据不同条件返回不同响应
            if filtered_data.len() > 10 {
                Ok("Data processed successfully, more than 10 items".to_string())
            } else {
                Ok("Data processed successfully, less than 10 items".to_string())
            }
        }
        Err(err) => {
            match err {
                Error::NetworkError => {
                    warn!("Network error occurred");
                    Err("Network error, please check your connection".to_string())
                }
                Error::ParseError => {
                    error!("Parse error occurred");
                    Err("Data parse error, please check data format".to_string())
                }
            }
        }
    }
}

// 模拟过滤数据的函数
fn filter_data(data: Data) -> Vec<Data> {
    // 实际实现过滤逻辑
    vec![data]
}