haxe
Musterabgleich
Suche…
Bemerkungen
Pattern Matching ist der Prozess der Verzweigung in Abhängigkeit von den bereitgestellten Mustern. Alle Musterübereinstimmungen werden innerhalb eines switch , und die Ausdrücke für den case repräsentieren die Muster.
Die Grundregeln des Pattern Matchings sind:
- Muster werden immer von oben nach unten angepasst.
- Für das oberste Muster, das mit dem Eingabewert übereinstimmt, wird der Ausdruck ausgeführt.
- Ein
_Muster stimmt mit irgendetwas überein, daher istcase _:gleichdefault:
Wenn alle möglichen Fälle behandelt werden, die catch-all _ Muster oder default ist nicht erforderlich.
Enum-Abgleich
Nehmen Sie die folgende Aufzählung an:
enum Operation {
Multiply(left : Int, right : Int);
}
Enum Matching kann wie folgt durchgeführt werden:
var result = switch(Multiply(1, 3)) {
case Multiply(_, 0):
0;
case Multiply(0, _):
0;
case Multiply(l, r):
l * r;
}
Verweise
Strukturabgleich
Nehmen Sie die folgende Struktur an:
var dog = {
name : "Woofer",
age : 7
};
Enum Matching kann wie folgt durchgeführt werden:
var message = switch(dog) {
case { name : "Woofer" }:
"I know you, Woofer!";
case _:
"I don't know you, sorry!";
}
Verweise
Array-Übereinstimmung
var result = switch([1, 6]) {
case [2, _]:
"0";
case [_, 6]:
"1";
case []:
"2";
case [_, _, _]:
"3";
case _:
"4";
}
Verweise
Oder Muster
Die | Der Operator kann an beliebigen Stellen innerhalb von Mustern verwendet werden, um mehrere akzeptierte Muster zu beschreiben. Wenn eine erfasste Variable in einem or-Muster vorhanden ist, muss sie in beiden Untermustern erscheinen.
var match = switch(7) {
case 4 | 1: "0";
case 6 | 7: "1";
case _: "2";
}
Verweise
Wachen
Es ist auch möglich, Muster mit Wachen weiter einzuschränken. Diese werden durch den case ... if(condition): definiert case ... if(condition): Syntax.
var myArray = [7, 6];
var s = switch(myArray) {
case [a, b] if (b > a):
b + ">" +a;
case [a, b]:
b + "<=" +a;
case _: "found something else";
}
Verweise
Extraktoren
Extraktoren werden durch den Ausdruck extractorExpression => match identifiziert. Extraktoren bestehen aus zwei Teilen, die durch den Operator => werden.
- Die linke Seite kann ein beliebiger Ausdruck sein, bei dem alle Vorkommen von Unterstrich
_durch den aktuell übereinstimmenden Wert ersetzt werden. - Die rechte Seite ist ein Muster, das mit dem Ergebnis der Bewertung der linken Seite verglichen wird.
Da die rechte Seite ein Muster ist, kann es einen anderen Extraktor enthalten. Das folgende Beispiel "kettet" zwei Extraktoren:
static public function main() {
switch(3) {
case add(_, 1) => mul(_, 3) => a:
trace(a); // mul(add(3 + 1), 3)
}
}
static function add(i1:Int, i2:Int) {
return i1 + i2;
}
static function mul(i1:Int, i2:Int) {
return i1 * i2;
}
Es ist derzeit nicht möglich, Extraktoren innerhalb von or-pattern zu verwenden. Es ist jedoch möglich, or-Muster auf der rechten Seite eines Extraktors zu haben.