我知道如何在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不是这样工作的。您需要处理错误,然后将成功值转换为判别式。