haxe
Dopasowywanie wzorów
Szukaj…
Uwagi
Dopasowywanie wzorców to proces rozgałęziania w zależności od dostarczonych wzorców. Wszystkie dopasowania wzorców są wykonywane w ramach wyrażeń switch , a wyrażenia poszczególnych case reprezentują wzorce.
Podstawowe zasady dopasowywania wzorców to:
- wzory zawsze będą dopasowane od góry do dołu;
- najwyższy wzorzec pasujący do wartości wejściowej ma wykonane wyrażenie;
- wzorzec
_pasuje do wszystkiego, więccase _:jest równydefault:
Gdy obsługiwane są wszystkie możliwe przypadki, wzór catch-all _ lub default przypadek nie jest wymagany.
Dopasowywanie enum
Załóżmy następujące wyliczenie:
enum Operation {
Multiply(left : Int, right : Int);
}
Dopasowywanie wyliczenia można wykonać w następujący sposób:
var result = switch(Multiply(1, 3)) {
case Multiply(_, 0):
0;
case Multiply(0, _):
0;
case Multiply(l, r):
l * r;
}
Bibliografia
Dopasowywanie struktur
Załóżmy następującą strukturę:
var dog = {
name : "Woofer",
age : 7
};
Dopasowywanie wyliczenia można wykonać w następujący sposób:
var message = switch(dog) {
case { name : "Woofer" }:
"I know you, Woofer!";
case _:
"I don't know you, sorry!";
}
Bibliografia
Dopasowywanie tablic
var result = switch([1, 6]) {
case [2, _]:
"0";
case [_, 6]:
"1";
case []:
"2";
case [_, _, _]:
"3";
case _:
"4";
}
Bibliografia
Lub wzory
The | Operator może być używany w dowolnym miejscu w obrębie wzorców do opisywania wielu akceptowanych wzorców. Jeśli istnieje przechwycona zmienna we wzorcu lub, musi ona pojawić się w obu pod-wzorach.
var match = switch(7) {
case 4 | 1: "0";
case 6 | 7: "1";
case _: "2";
}
Bibliografia
Gwardia
Możliwe jest również dalsze ograniczenie wzorów za pomocą strażników. Są one zdefiniowane przez case ... if(condition): składnia.
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";
}
Bibliografia
Ekstraktory
Ekstraktory są identyfikowane przez extractorExpression => match wyrażenie. Ekstraktory składają się z dwóch części, które są oddzielone operatorem => .
- Lewa strona może być dowolnym wyrażeniem, w którym wszystkie wystąpienia podkreślenia
_są zastępowane aktualnie dopasowaną wartością. - Prawa strona to wzór, który jest dopasowany do wyniku oceny lewej strony.
Ponieważ prawa strona jest wzorem, może zawierać kolejny ekstraktor. Poniższy przykład „łączy” dwa ekstraktory:
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;
}
Obecnie nie można używać ekstraktorów w ramach or-wzorców. Możliwe jest jednak posiadanie or-wzorów po prawej stronie ekstraktora.