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

2023-12-31

My 是创建名为的方法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"),
    }
}

正确的做法是实施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,
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将字符串转换为枚举? 的相关文章

随机推荐