Sök…


Anmärkningar

Mönstermatchning är förgreningsprocessen beroende på tillhandahållna mönster. All mönstermatchning sker inom en switch uttryck och enskilda case uttryck representerar mönstren.

De grundläggande reglerna för mönstermatchning är:

  • mönster kommer alltid att matchas från topp till botten;
  • det översta mönstret som matchar ingångsvärdet har sitt uttryck exekverat;
  • ett _ mönster matchar vad som helst, så case _: är lika med default:

När alla möjliga ärenden hanteras krävs inte catch-all _ mönstret eller default .

Enum matchning

Anta följande enum:

enum Operation {
    Multiply(left : Int, right : Int);
}

Enum-matchning kan utföras enligt följande:

var result = switch(Multiply(1, 3)) {
    case Multiply(_, 0):
        0;
    case Multiply(0, _):
        0;
    case Multiply(l, r):
        l * r;
}

referenser

Strukturmatchning

Antag följande struktur:

var dog = {
    name : "Woofer",
    age : 7
};

Enum-matchning kan utföras enligt följande:

var message = switch(dog) {
    case { name : "Woofer" }:
        "I know you, Woofer!";
    case _:
        "I don't know you, sorry!";
}

referenser

Array-matchning

var result = switch([1, 6]) {
    case [2, _]:
        "0";
    case [_, 6]:
        "1";
    case []:
        "2";
    case [_, _, _]:
        "3";
    case _:
        "4";
}

referenser

Eller mönster

Den | operatör kan användas var som helst inom mönster för att beskriva flera accepterade mönster. Om det finns en infångad variabel i ett eller -mönster, måste den visas i båda dess undermönster.

var match = switch(7) {
    case 4 | 1: "0";
    case 6 | 7: "1";
    case _: "2";
}

referenser

vakter

Det är också möjligt att ytterligare begränsa mönster med vakter. Dessa definieras av 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";
}

referenser

Extraktorer

Extraktorer identifieras med extractorExpression => match uttryck. Extraktorer består av två delar som är separerade av => operatören.

  1. Vänster sida kan vara valfritt uttryck, där alla förekomster av understruk _ ersätts med det för närvarande matchade värdet.
  2. Höger sida är ett mönster som matchas mot resultatet av utvärderingen av vänster sida.

Eftersom den högra sidan är ett mönster, kan den innehålla en annan extraktor. Följande exempel "kedjer" två extraherare:

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;
}

Det är för närvarande inte möjligt att använda extraktorer inom eller -mönster. Det är emellertid möjligt att ha eller -mönster på höger sida av en extraktor.

referenser



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow