如何通过名称获取枚举值?

How can I get enum value by its name?

我在Java知道怎么做。

看来我需要实施 TryFrom 或类似的东西。

enum ROMAN {
    I = 1,
    V = 5,
    X = 10,
    L = 50,
    C = 100,
    D = 500,
    M = 1000
}

我想通过枚举名称获取值。

println!("{:?}", ROMAN::valueOf("M")); // It should be `1000`

手动实施 FromStrTryFrom,或使用提供这些功能的类似 enum_derive 的东西。

或者只是在您的枚举上添加一个定制的 value_of 方法,而不用担心特征。

或者全部都做,虽然看起来有点多

impl Roman {
    pub fn value_of(s: &str) -> Option<Self> {
        Some(match s {
            "I" => Self::I,
            "V" => Self::V,
            "X" => Self::X,
            "L" => Self::L,
            "C" => Self::C,
            "D" => Self::D,
            "M" => Self::M,
            _ => return None,
        })
    }
}
impl FromStr for Roman {
    type Err = (); // should probably provide something more useful
    fn from_str(s: &str) -> Result<Self, Self::Err> {
        Self::value_of(s).ok_or(())
    }
}
impl TryFrom<&str> for Roman {
    type Error = ();
    fn try_from(s: &str) -> Result<Self, Self::Error> {
        Self::value_of(s).ok_or(())
    }
}
println!("{:?}", ROMAN::valueOf("M")); // It should be `1000`

它永远不会是 1000 因为 Rust 不是这样工作的。您需要处理错误 然后 将成功值转换为其判别式。