例如,如果我有如下代码:
enum Foo {
Bar,
Baz,
Bat,
Quux
}
impl Foo {
from(input: &str) -> Foo {
Foo::input
}
}
这显然会失败,因为input
不是 Foo 的方法。我可以手动输入:
from(input: &str) -> Foo {
match(input) {
"Bar" => Foo::Bar,
// and so on...
}
}
但我没有得到自动的便利。
看起来Java有一个字符串查找函数 https://stackoverflow.com/questions/604424/lookup-enum-by-string-value用于此特定目的的枚举。
是否可以在不编写自己的宏或从板条箱中导入宏的情况下获得这个?
你应该实施std::str::FromStr https://doc.rust-lang.org/std/str/trait.FromStr.html trait.
use std::str::FromStr;
#[derive(Debug, PartialEq)]
enum Foo {
Bar,
Baz,
Bat,
Quux,
}
impl FromStr for Foo {
type Err = ();
fn from_str(input: &str) -> Result<Foo, Self::Err> {
match input {
"Bar" => Ok(Foo::Bar),
"Baz" => Ok(Foo::Baz),
"Bat" => Ok(Foo::Bat),
"Quux" => Ok(Foo::Quux),
_ => Err(()),
}
}
}
fn main() {
// Use it like this
let f = Foo::from_str("Baz").unwrap();
assert_eq!(f, Foo::Baz);
}
代码生成(又名自动便利)和反射通常会产生成本。实际上,您最终不太可能得到多个枚举变体。
运行在
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)