2016-04-08 31 views
3

original approachto_str() adlı bir yöntem oluşturmak için bir dilim döndürecektir, ancak doğru bir yaklaşım olduğundan emin değilim.Bir dize enum nasıl dönüştürülür?

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 evet, haklı değilsiniz derleme. Bence asıl yazıdan bahsetmeliyim. Rastgele dize dilimini belirli enum ile eşleştirmeye çalışıyordum. – Sergey

cevap

9

doğru şey FromStr uygulamaktır:

#[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); 
} 

, bir değeri yazdırmak Display veya Debug (Ben burada türetilmiş ettik) uygulamak. Display'u uygulamak da size .to_string() verir.

+0

Teşekkürler @Shepmaster, mükemmel görünüyor. – Sergey

İlgili konular