2016-04-08 43 views
3

我的original approach是创建一个名为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"), 
    } 
} 
+0

@Shepmaster是的,你是对的,它不会编译。我想我应该在原文中提及它。我试图将随机字符串切片与特定枚举相匹配。 – Sergey

回答

9

正确的做法是实施FromStr

#[derive(Debug)] 
enum WSType { 
    Ack, 
    Request, 
    Response, 
} 

impl std::str::FromStr for WSType { 
    type Err = &'static str; 

    fn from_str(s: &str) -> Result<Self, Self::Err> { 
     match s { 
      "ACK" => Ok(WSType::Ack), 
      "REQUEST" => Ok(WSType::Request), 
      "RESPONSE" => Ok(WSType::Response), 
      _ => Err("not a valid value"), 
     } 
    } 
} 

fn main() { 
    let as_enum: WSType = "ACK".parse().unwrap(); 
    println!("{:?}", as_enum); 
} 

要打印值,实现DisplayDebug(我在这里得到的话)。实施Display也会给你.to_string()

+0

谢谢@Shepmaster,它看起来很完美。 – Sergey