Bri*_*ler 1 enums lowercase rust display write
我有一个枚举:
pub enum BoxColour {
Red,
Blue,
}
Run Code Online (Sandbox Code Playgroud)
我不仅希望将此值作为 string 获取,而且还希望将该值转换为小写。
这有效:
impl Display for BoxColour {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
fmt.write_str(match self {
BoxColour::Red => "red",
BoxColour::Blue => "blue",
})?;
Ok(())
}
}
Run Code Online (Sandbox Code Playgroud)
当颜色列表增加时,该列表需要更新。
如果我使用write!宏,似乎不可能操纵结果,因为write!返回一个实例()而不是一个String:
impl Display for BoxColour {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "{:?}", self)
}
}
Run Code Online (Sandbox Code Playgroud)
这表明这是通过副作用起作用的,也许我们可以在内存中破解该值的相同位置,但即使这是可能的,也可能不是一个好主意......
这是一种方法,无需Display::fmt每次通过使用派生Debug实现并小写添加新颜色时手动更新:
#[derive(Debug)]
pub enum BoxColour {
Red,
Blue,
}
impl fmt::Display for BoxColour {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "{}", format!("{:?}", self).to_lowercase())
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,write!返回 a Result<(), fmt::Error>(这是 a fmt::Result),而不是raw ()。
但请考虑手动更新列表是否会更好,或者使用宏来指定它。LightBlue还要考虑如何将具有多个单词(例如 )的颜色小写:这是lightblue您想要的吗?
该strum板条箱提供了一种实现一个派生宏Display用于枚举和任选lowercasing所述变体名称:
use strum_macros::Display;
#[derive(Display)]
// If we don't care about inner capitals, we don't need to set `serialize_all`
// and can leave parenthesis empty.
#[strum(serialize_all = "snake_case")]
pub enum BoxColour {
Red,
Blue,
LightGreen, // example of how inner capitals are treated
}
fn main() {
for c in [BoxColour::Red, BoxColor::Blue, BoxColor::LightGreen] {
println!("{}", c);
}
}
Run Code Online (Sandbox Code Playgroud)
您还需要strum在您的Cargo.toml:
[dependencies]
strum = { version = "0.21", features = ["derive"] }
Run Code Online (Sandbox Code Playgroud)
这应该打印:
red
blue
light_green
Run Code Online (Sandbox Code Playgroud)
strum将生成类似于您提到的matchwithBoxColour::Red => "red",案例的代码,但无需手动更新。