使用impl fmt::Display将枚举转换为字符串



使用Rust,我试图创建一个错误代码枚举。

pub enum ErrorCode {
InvalidUsername,
InvalidPassword,
}

我希望这个枚举在使用activ_web的JSON响应中使用,所以我需要将枚举转换为字符串。

为此,我尝试在ErrorCode枚举上实现fmt::Display

#[derive(Debug)]
pub enum ErrorCode {
InvalidUsername,
InvalidPassword,
}
impl fmt::Display for ErrorCode {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", *self)
}
}

但是每当我试图在ErrorCode上运行.to_string()时,程序就会崩溃,并产生一个无限循环。

thread 'actix-rt:worker:0' has overflowed its stack
fatal runtime error: stack overflow
[1]    85991 abort      ./target/debug/app

我想把枚举作为一个字符串,并能够在impl fmt::Display中对字符串进行变异,这样我就可以做一些事情,比如将其转换为snake_case。

不能在fmt()函数内部调用write!()来用self替换{},因为此宏调用完全相同的函数,从而创建无限循环。

相反,您应该使用函数f: &mut fmt::Formatter的参数来编写您想要的结果。

match self {
ErrorCode::InvalidUsername => f.write_str("Invalid user name"),
...
}

在这种情况下,还有一些库可以帮助您减少样板代码。一种是EvilTak建议的弹拨。

最新更新