haxe
Correspondance de motif
Recherche…
Remarques
La correspondance de motif est le processus de branchement en fonction des modèles fournis. Toutes les correspondances de motifs sont effectuées dans une expression de switch et les expressions de case individuelles représentent les modèles.
Les règles fondamentales de la correspondance de modèle sont les suivantes:
- les motifs seront toujours assortis de haut en bas;
- le motif le plus haut qui correspond à la valeur d'entrée a son expression exécutée;
- un motif
_correspond à rien, donccase _:est égal àdefault:
Lorsque tous les cas possibles sont traités, le modèle catch-all _ ou default cas default n'est pas requis.
Enum correspondant
Supposons l'énumération suivante:
enum Operation {
Multiply(left : Int, right : Int);
}
L'appariement enum peut être effectué comme suit:
var result = switch(Multiply(1, 3)) {
case Multiply(_, 0):
0;
case Multiply(0, _):
0;
case Multiply(l, r):
l * r;
}
Les références
Correspondance de structure
Supposez la structure suivante:
var dog = {
name : "Woofer",
age : 7
};
L'appariement enum peut être effectué comme suit:
var message = switch(dog) {
case { name : "Woofer" }:
"I know you, Woofer!";
case _:
"I don't know you, sorry!";
}
Les références
Array correspondant
var result = switch([1, 6]) {
case [2, _]:
"0";
case [_, 6]:
"1";
case []:
"2";
case [_, _, _]:
"3";
case _:
"4";
}
Les références
Ou des motifs
Le | L'opérateur peut être utilisé n'importe où dans les modèles pour décrire plusieurs modèles acceptés. S'il y a une variable capturée dans un motif, elle doit apparaître dans ses deux sous-modèles.
var match = switch(7) {
case 4 | 1: "0";
case 6 | 7: "1";
case _: "2";
}
Les références
Gardes
Il est également possible de restreindre davantage les modèles avec les gardes. Celles-ci sont définies par la case ... if(condition): syntaxe.
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";
}
Les références
Extracteurs
Les extracteurs sont identifiés par l'expression extractorExpression => match . Les extracteurs se composent de deux parties séparées par l'opérateur => .
- Le côté gauche peut être n'importe quelle expression, où toutes les occurrences du trait de soulignement
_sont remplacées par la valeur correspondante. - Le côté droit est un motif qui correspond au résultat de l’évaluation du côté gauche.
Comme le côté droit est un motif, il peut contenir un autre extracteur. L'exemple suivant "enchaîne" deux extracteurs:
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;
}
Il est actuellement impossible d'utiliser des extracteurs dans ou-patterns. Cependant, il est possible d'avoir des ou-patterns sur le côté droit d'un extracteur.