2016-04-08 17 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); 
} 

DisplayまたはDebugを実装し、値を印刷するには(私はここでそれを得てきました)。 Displayを実装すると、.to_string()も得られます。

+0

ありがとう@Shepmaster、それは完璧に見えます。 – Sergey

関連する問題