Zum Inhalt springen

Pattern Matching

fn main() {
let x = (0, 1);
match x {
(_, y) if y == 0 => println!("A"),
(0, _) => println!("B"),
_ => println!("C")
}
}

Der erste Zweig matcht y = 1 , was bedeutet, dass y != 0 , daher schlägt das Muster fehl. Der zweite Zweig erfordert, dass x == 0 ist, was wahr ist, daher ist das Muster erfolgreich.


Betrachten Sie das folgende Programm:

let a = [(0, 1)];
let ?? = a;

Welche der folgenden sind gültige Muster, die den Platzhalter ?? ersetzen könnten?

Das Muster (_, n) ist nicht gültig, da a ein Array von Tupeln ist, nicht ein Tupel selbst.


fn main() {
let x = Some(&[0, 1]);
match x {
Some(&[.., 1, ..]) => println!("A"),
Some(&[0, 1]) | None => println!("B"),
_ => println!("C")
}
}

Es ist nicht gültig, .. auf beiden Seiten eines Wertes zu verwenden, da es mehrdeutig ist, auf welches Array-Element Bezug genommen wird.


Angenommen, wir haben einen Typ Point mit der folgenden Definition:

struct Point {
x: i32,
y: i32
}

Angesichts des folgenden Musters:

Point { x: x @ 0 ..= 5, y } if x + y != 0

Welche der folgenden Werte passen zu diesem Muster?

Dieses Muster spezifiziert, dass x zwischen 0 und 5 (einschließlich) liegen muss und dass x + y != 0 . Daher sind Point { x: 5, y: -4 } und Point { x: 0, y: 1 } gültig, während Point { x: -1, y: 2 } und Point { x: 3, y: -3 } es nicht sind.