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 ist case _: gleich default:

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.

  1. Die linke Seite kann ein beliebiger Ausdruck sein, bei dem alle Vorkommen von Unterstrich _ durch den aktuell übereinstimmenden Wert ersetzt werden.
  2. 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.

Verweise



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow