如何将字符串转换为枚举?

Ser*_*ey 4 enums casting rust

最初的方法是创建一个方法to_str(),它将返回一个切片,但我不确定它是否正确,因为这个代码不能编译.

enum WSType {
    ACK,
    REQUEST,
    RESPONSE,
}

impl WSType {
    fn to_str(&self) -> &str {
        match self {
            ACK => "ACK",
            REQUEST => "REQUEST",
            RESPONSE => "RESPONSE",            
        }
    }
}

fn main() {
    let val = "ACK";
    // test
    match val {
        ACK.to_str() => println!("ack"),
        REQUEST.to_str() => println!("ack"),
        RESPONSE.to_str() => println!("ack"),
        _ => println!("unexpected"),
    }
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 11

正确的是实施FromStr.在这里,我匹配代表每个枚举变体的字符串文字:

#[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);
}
Run Code Online (Sandbox Code Playgroud)

要打印一个值,请执行DisplayDebug(我在Debug此处派生).实施Display也给你.to_string().


在某些情况下,有一些箱子可以减少这种转换的一些单调乏味.弹簧是一个这样的箱子:

use strum_macros::EnumString;

#[derive(Debug, EnumString)]
#[strum(serialize_all = "shouty_snake_case")]
enum WSType {
    Ack,
    Request,
    Response,
}
Run Code Online (Sandbox Code Playgroud)