如何通过名称获取枚举值?
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`
手动实施 FromStr
或 TryFrom
,或使用提供这些功能的类似 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 不是这样工作的。您需要处理错误 然后 将成功值转换为其判别式。
我在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`
手动实施 FromStr
或 TryFrom
,或使用提供这些功能的类似 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 不是这样工作的。您需要处理错误 然后 将成功值转换为其判别式。