2016-04-16 7 views
1

In meinem Code unten finde ich, dass der Code in match_num_works() eine gewisse Eleganz hat. Ich würde gerne ein String Match mit einer ähnlichen Formulierung schreiben, aber es kann nicht funktionieren. Ich am Ende mit match_text_works(), die weniger elegant ist.Wie Muster passen einen String in einer Struktur gegen ein Literal

struct FooNum { 
    number: i32, 
} 

// Elegant 
fn match_num_works(foo_num: &FooNum) { 
    match foo_num { 
     &FooNum { number: 1 } =>(), 
     _ =>(), 
    } 
} 

struct FooText { 
    text: String, 
} 

// Clunky 
fn match_text_works(foo_text: &FooText) { 
    match foo_text { 
     &FooText { ref text } => { 
      if text == "pattern" { 
      } else { 
      } 
     } 
    } 
} 

// Possible? 
fn match_text_fails(foo_text: &FooText) { 
    match foo_text { 
     &FooText { text: "pattern" } =>(), 
     _ =>(), 
    } 
} 

Antwort

5

Sein vermutlich nicht "elegant" oder ein schöner .. aber eine Möglichkeit ist, die bedingten in das Spiel Ausdruck zu bewegen:

match foo_text { 
    &FooText { ref text } if text == "pattern" =>(), 
    _ =>() 
} 

Working sample: Playpen link.

+0

Dank! Das wird reichen. – ebaklund

0

Beachten Sie, dass Ihr gewünschtes Muster tatsächlich mit einem &str arbeiten würde. Sie können ein String nicht direkt mit dem Muster vergleichen, da es sich um einen komplexeren Wert handelt, der einen unbelichteten internen Puffer enthält.

struct FooText<'a> { 
    text: &'a str, 
    _other: u32, 
} 

fn main() { 
    let foo = FooText { text: "foo", _other: 5 }; 
    match foo { 
     FooText { text: "foo", .. } => println!("Match!"), 
     _ => println!("No match"), 
    } 
} 

Playground

Verwandte Themen