MST

星途 面试题库

面试题:Rust结构体初始化方法优化之复杂场景

定义一个`User`结构体,包含`name`(`String`类型)、`age`(`u8`类型)、`email`(`String`类型)和`is_admin`(`bool`类型)字段。在初始化时,`name`不能为空,`age`需在合理范围(0 - 120)内,`email`需满足一定格式(简单假设为包含`@`字符)。请设计一个优化的初始化方法,能够有效处理可能出现的错误,并说明优化点及对性能的影响。
10.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::fmt::{Display, Formatter, Result as FmtResult};

#[derive(Debug)]
struct User {
    name: String,
    age: u8,
    email: String,
    is_admin: bool,
}

#[derive(Debug)]
enum UserCreationError {
    NameEmpty,
    AgeOutOfRange,
    InvalidEmail,
}

impl Display for UserCreationError {
    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
        match self {
            UserCreationError::NameEmpty => write!(f, "Name cannot be empty"),
            UserCreationError::AgeOutOfRange => write!(f, "Age must be between 0 and 120"),
            UserCreationError::InvalidEmail => write!(f, "Email must contain @"),
        }
    }
}

impl User {
    fn new(name: &str, age: u8, email: &str, is_admin: bool) -> Result<User, UserCreationError> {
        if name.is_empty() {
            return Err(UserCreationError::NameEmpty);
        }
        if age > 120 {
            return Err(UserCreationError::AgeOutOfRange);
        }
        if!email.contains('@') {
            return Err(UserCreationError::InvalidEmail);
        }

        Ok(User {
            name: name.to_string(),
            age,
            email: email.to_string(),
            is_admin,
        })
    }
}

优化点

  1. 错误处理:使用Result枚举来返回可能出现的错误,使得调用者能够清晰地了解初始化失败的原因,提高代码的健壮性。
  2. 输入验证:在初始化时直接对输入参数进行验证,避免在后续使用中出现未定义行为。

性能影响

  • 时间性能:在初始化过程中增加了验证逻辑,会略微增加初始化时间。但验证逻辑简单,对整体性能影响较小。
  • 空间性能:增加了UserCreationError枚举类型用于错误处理,会增加一定的内存消耗,但这部分消耗在大多数场景下可忽略不计。