haxe
Mönstermatchning
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 meddefault:
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.
- 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. - 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.