如何以小写形式显示枚举?

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)

这表明这是通过副作用起作用的,也许我们可以在内存中破解该值的相同位置,但即使这是可能的,也可能不是一个好主意......

loo*_*ops 7

这是一种方法,无需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您想要的吗?


Kev*_*eid 5

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",案例的代码,但无需手动更新。

  • @BrianKessler,你可以随时更改,接受的答案只是“我选择解决我的问题”提示未来的读者,不用担心。 (2认同)