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,
})
}
}
优化点
- 错误处理:使用
Result
枚举来返回可能出现的错误,使得调用者能够清晰地了解初始化失败的原因,提高代码的健壮性。
- 输入验证:在初始化时直接对输入参数进行验证,避免在后续使用中出现未定义行为。
性能影响
- 时间性能:在初始化过程中增加了验证逻辑,会略微增加初始化时间。但验证逻辑简单,对整体性能影响较小。
- 空间性能:增加了
UserCreationError
枚举类型用于错误处理,会增加一定的内存消耗,但这部分消耗在大多数场景下可忽略不计。