MST

星途 面试题库

面试题:Rust结构体在复杂业务逻辑下结合Result枚举的错误处理

有一个Rust项目,涉及多个结构体,例如`User`结构体包含用户信息,`Database`结构体负责数据库交互。现在有一个业务逻辑是从数据库中读取用户信息并进行复杂的验证(比如年龄是否合法、邮箱格式是否正确等),若任何一步出现错误,需要通过Result枚举返回恰当的错误信息。请描述整体的设计思路并给出核心代码片段。
25.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义结构体:分别定义UserDatabase结构体,User结构体用于存储用户信息,Database结构体用于封装数据库交互相关的方法。
  2. 定义错误类型:创建一个自定义的错误枚举,用于表示在验证过程中可能出现的各种错误情况。
  3. 数据库读取方法:在Database结构体中实现读取用户信息的方法,该方法返回Result<User, 自定义错误类型>
  4. 用户信息验证方法:在User结构体上实现验证方法,该方法也返回Result<(), 自定义错误类型>,在方法中进行年龄和邮箱格式等复杂验证。
  5. 业务逻辑整合:在业务逻辑函数中,先从数据库读取用户信息,然后对读取到的用户信息进行验证,根据验证结果返回相应的Result

核心代码片段

// 定义自定义错误类型
#[derive(Debug)]
enum UserValidationError {
    AgeInvalid,
    EmailFormatInvalid,
    DatabaseReadError,
}

// User结构体
struct User {
    age: u8,
    email: String,
}

// Database结构体
struct Database {
    // 这里可包含数据库连接等相关字段
}

impl Database {
    // 从数据库读取用户信息的方法
    fn read_user(&self) -> Result<User, UserValidationError> {
        // 实际实现中这里应该是与数据库交互获取数据
        // 这里简单模拟返回一个用户信息
        Ok(User {
            age: 25,
            email: "example@example.com".to_string(),
        })
    }
}

impl User {
    // 用户信息验证方法
    fn validate(&self) -> Result<(), UserValidationError> {
        if self.age < 18 || self.age > 120 {
            return Err(UserValidationError::AgeInvalid);
        }
        if!self.email.contains('@') {
            return Err(UserValidationError::EmailFormatInvalid);
        }
        Ok(())
    }
}

// 业务逻辑函数
fn business_logic() -> Result<(), UserValidationError> {
    let db = Database {};
    let user = db.read_user()?;
    user.validate()
}