2016-07-21 5 views
3

Dies wäre ein schönes fizzbuzz in Rust sein denke ich:Was passiert, wenn der Ausdruck in einem Übereinstimmungsarm false zurückgibt?

match (i % 3, i % 5) { 
    (0, 0) => println!("FizzBuzz"), 
    (0, _) => println!("Fizz"), 
    (_, 0) => println!("Buzz"), 
    _ => println!("{}", i), 
} 

Es auch auf diese Weise erklärt werden könnte:

match i { 
    i if i % 3 == 0 && i % 5 == 0 => println!("FizzBuzz"), 
    i if i % 3 == 0 => println!("Fizz"), 
    i if i % 5 == 0 => println!("Buzz"), 
    _ => println!("{}", i), 
} 

Nun, die mich verwirrt.

i if i % 3 == 0 

ist ein Ausdruck, richtig? Dies ergibt i, wenn die Bedingung wahr ist. Aber was passiert, wenn es falsch ist?

+0

Das erste ist ein ziemlich ordentliches FizzBuzz, daran habe ich nie gedacht –

Antwort

8

Nun, dass mich verwirrt.

i if i % 3 == 0 

ist ein Ausdruck, richtig?

Nein, ist es nicht. Es ist ein Muster (i) mit einem guard (i % 3 == 0). Vielleicht warst du verwirrt, weil du den gleichen Bindnamen benutzt hast. Betrachten Sie dieses modifizierte Beispiel:

match i { 
    x if x % 3 == 0 && x % 5 == 0 => println!("FizzBuzz"), 
    x if x % 3 => println!("Fizz"), 
    x if x % 5 => println!("Buzz"), 
    _ => println!("{}", x), 
} 

Sie können das Spiel Ausdruck lesen wie diese

  • Wenn i dem Muster übereinstimmt x (es immer übereinstimmen und i Wert bewegt wird (kopiert) zu x) und x % 3 == 0 und x % 5 == 0 dann println!("FizzBuzz"); sonst
  • wenn i das Muster x und x % 3 == 0 dann println!("Fizz") entspricht; sonst
  • wenn i mit dem Muster x und x % 5 == 0 übereinstimmt, dann println!("Buzz"); sonst
  • println!("{}", x)
2

Wenn es falsch ist, wird der Match-Arm einfach nicht aufgerufen. Diese werden in der Match-Anweisung als Wächter bezeichnet. Sie können über sie in the book lesen.

Sie sind ähnlich auf ein if-else aber nicht in dem Fall, dass es eine ist else Block. Sie fügen den Match-Blöcken einfach mehr Filter hinzu.

2

i if i % 3 ist ein Ausdruck, nicht wahr?

Nein, ist es nicht. i if i % 3 == 0 ist ein Muster, das aus dem einfachen Muster i und dem Musterschutz if i % 3 == 0 besteht. Ein Musterwächter ist das Schlüsselwort if gefolgt von einem booleschen Ausdruck. Es kann nach jedem einfachen Muster kommen (wobei mit "einfaches Muster" jedes Muster gemeint ist, das nicht bereits einen Musterschutz hat).

Wenn ein Muster mit einem Musterschutz passt, wird der Musterschutz ausgewertet. Wenn es als wahr ausgewertet wird, wird der zugehörige Zweig ausgeführt.Andernfalls wird das nächste Muster aufgerufen, als ob das Muster nicht übereinstimmt.

Verwandte Themen