正确的做法是实施FromStr http://doc.rust-lang.org/std/str/trait.FromStr.html。在这里,我与代表每个枚举变体的字符串文字进行匹配:
#[derive(Debug)]
enum WSType {
Ack,
Request,
Response,
}
impl std::str::FromStr for WSType {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"ACK" => Ok(WSType::Ack),
"REQUEST" => Ok(WSType::Request),
"RESPONSE" => Ok(WSType::Response),
_ => Err(format!("'{}' is not a valid value for WSType", s)),
}
}
}
fn main() {
let as_enum: WSType = "ACK".parse().unwrap();
println!("{:?}", as_enum);
let as_enum: WSType = "UNKNOWN".parse().unwrap();
println!("{:?}", as_enum);
}
要打印值,请执行Display https://doc.rust-lang.org/std/fmt/trait.Display.html or Debug https://doc.rust-lang.org/std/fmt/trait.Debug.html(我已经导出Debug
这里)。实施Display
还给你.to_string()
.
在某些情况下,有一些包可以减少此类转换的一些乏味。strum https://crates.io/crates/strum就是这样一个箱子:
use strum_macros::EnumString;
#[derive(Debug, EnumString)]
#[strum(serialize_all = "shouty_snake_case")]
enum WSType {
Ack,
Request,
Response,
}