MST

星途 面试题库

面试题:Rust Result枚举链式调用中的复杂逻辑处理

假设你有一个函数`fetch_user_data`,它返回`Result<UserData, FetchError>`,`UserData`包含用户的年龄和姓名。另一个函数`validate_user`,接受`UserData`并返回`Result<(), ValidationError>`。要求通过Result枚举的链式调用,实现获取用户数据并验证,如果任何一步失败,返回恰当的错误,并且在验证成功后打印出用户的姓名和年龄。请编写相关代码。
27.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
enum FetchError {
    // 定义获取数据可能的错误
    NetworkError,
    ServerError,
}

enum ValidationError {
    // 定义验证数据可能的错误
    AgeInvalid,
    NameInvalid,
}

struct UserData {
    age: u8,
    name: String,
}

fn fetch_user_data() -> Result<UserData, FetchError> {
    // 模拟获取用户数据
    Err(FetchError::NetworkError)
}

fn validate_user(user_data: UserData) -> Result<(), ValidationError> {
    // 模拟验证用户数据
    if user_data.age < 18 {
        Err(ValidationError::AgeInvalid)
    } else if user_data.name.is_empty() {
        Err(ValidationError::NameInvalid)
    } else {
        Ok(())
    }
}

fn main() {
    let result = fetch_user_data()
      .and_then(|user_data| {
            validate_user(user_data)
              .map(|_| user_data)
        })
      .map(|user_data| {
            println!("姓名: {}, 年龄: {}", user_data.name, user_data.age);
        });

    match result {
        Ok(_) => (),
        Err(error) => match error {
            FetchError::NetworkError => println!("获取数据时网络错误"),
            FetchError::ServerError => println!("获取数据时服务器错误"),
            ValidationError::AgeInvalid => println!("年龄验证失败"),
            ValidationError::NameInvalid => println!("姓名验证失败"),
        },
    }
}