haxe
Pattern matching
Ricerca…
Osservazioni
La corrispondenza del modello è il processo di ramificazione in base ai modelli forniti. Tutte le combinazioni di pattern vengono eseguite all'interno di un'espressione switch e le singole espressioni di case rappresentano i pattern.
Le regole fondamentali della corrispondenza del modello sono:
- i modelli saranno sempre abbinati da cima a fondo;
- il modello più in alto che corrisponde al valore di input ha la sua espressione eseguita;
- un
_modello corrisponde a qualsiasi cosa, quindicase _:è uguale aldefault:
Quando vengono gestiti tutti i casi possibili, il pattern catch-all _ o default caso default non è richiesto.
Corrispondenza Enum
Supponi il seguente enum:
enum Operation {
Multiply(left : Int, right : Int);
}
La corrispondenza Enum può essere eseguita come segue:
var result = switch(Multiply(1, 3)) {
case Multiply(_, 0):
0;
case Multiply(0, _):
0;
case Multiply(l, r):
l * r;
}
Riferimenti
Struttura corrispondente
Assumi la seguente struttura:
var dog = {
name : "Woofer",
age : 7
};
La corrispondenza Enum può essere eseguita come segue:
var message = switch(dog) {
case { name : "Woofer" }:
"I know you, Woofer!";
case _:
"I don't know you, sorry!";
}
Riferimenti
Corrispondenza delle matrici
var result = switch([1, 6]) {
case [2, _]:
"0";
case [_, 6]:
"1";
case []:
"2";
case [_, _, _]:
"3";
case _:
"4";
}
Riferimenti
O modelli
Il | l'operatore può essere utilizzato ovunque all'interno di schemi per descrivere più schemi accettati. Se c'è una variabile catturata in un modello or, deve apparire in entrambi i suoi sotto-modelli.
var match = switch(7) {
case 4 | 1: "0";
case 6 | 7: "1";
case _: "2";
}
Riferimenti
guardie
È anche possibile limitare ulteriormente i modelli con le guardie. Questi sono definiti dal case ... if(condition): sintassi.
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";
}
Riferimenti
estrattori
Gli estrattori sono identificati da extractorExpression => match espressione di extractorExpression => match . Gli estrattori sono costituiti da due parti, che sono separate dall'operatore => .
- Il lato sinistro può essere qualsiasi espressione, in cui tutte le occorrenze di underscore
_vengono sostituite con il valore correntemente corrisposto. - Il lato destro è un modello che viene confrontato con il risultato della valutazione del lato sinistro.
Poiché il lato destro è un modello, può contenere un altro estrattore. Nell'esempio seguente "catene" due estrattori:
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;
}
Al momento non è possibile utilizzare estrattori all'interno di or-patterns. Tuttavia, è possibile avere or-patterns sul lato destro di un estrattore.