haxe
Patroonaanpassing
Zoeken…
Opmerkingen
Patroonafstemming is het vertakkingsproces afhankelijk van de verstrekte patronen. Alle patroonherkenning wordt uitgevoerd bij een switch expressie en individueel case uitdrukkingen geven de patronen.
De fundamentele regels voor het matchen van patronen zijn:
- patronen worden altijd van boven naar beneden gematcht;
- de expressie wordt uitgevoerd op het bovenste patroon dat overeenkomt met de invoerwaarde;
- een
_patroon komt met alles overeen, duscase _:is gelijk aandefault:
Wanneer alle mogelijke gevallen worden afgehandeld, is het verzamelpatroon _ of default niet vereist.
Enum matching
Ga uit van de volgende opsomming:
enum Operation {
Multiply(left : Int, right : Int);
}
Enum-matching kan als volgt worden uitgevoerd:
var result = switch(Multiply(1, 3)) {
case Multiply(_, 0):
0;
case Multiply(0, _):
0;
case Multiply(l, r):
l * r;
}
Referenties
Structuuraanpassing
Ga uit van de volgende structuur:
var dog = {
name : "Woofer",
age : 7
};
Enum-matching kan als volgt worden uitgevoerd:
var message = switch(dog) {
case { name : "Woofer" }:
"I know you, Woofer!";
case _:
"I don't know you, sorry!";
}
Referenties
Array matching
var result = switch([1, 6]) {
case [2, _]:
"0";
case [_, 6]:
"1";
case []:
"2";
case [_, _, _]:
"3";
case _:
"4";
}
Referenties
Of patronen
De | operator kan overal in patronen worden gebruikt om meerdere geaccepteerde patronen te beschrijven. Als er een vastgelegde variabele in een of-patroon is, moet deze in beide subpatronen verschijnen.
var match = switch(7) {
case 4 | 1: "0";
case 6 | 7: "1";
case _: "2";
}
Referenties
Guards
Het is ook mogelijk om patronen met bewakers verder te beperken. Deze worden bepaald door het case ... if(condition): syntaxis.
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";
}
Referenties
extractors
Extractoren worden geïdentificeerd door de extractorExpression => match expressie. Extractoren bestaan uit twee delen, die worden gescheiden door de operator => .
- De linkerkant kan elke expressie zijn, waarbij alle onderstrepingstekens
_worden vervangen door de momenteel overeenkomende waarde. - De rechterkant is een patroon dat wordt vergeleken met het resultaat van de evaluatie van de linkerkant.
Aangezien de rechterkant een patroon is, kan deze een andere extractor bevatten. Het volgende voorbeeld "ketent" twee extractors:
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;
}
Het is momenteel niet mogelijk om extractors in of-patronen te gebruiken. Het is echter mogelijk om or-patronen aan de rechterkant van een extractor te hebben.