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ęc case _: jest równy default:

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 => .

  1. Lewa strona może być dowolnym wyrażeniem, w którym wszystkie wystąpienia podkreślenia _ są zastępowane aktualnie dopasowaną wartością.
  2. 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.

Bibliografia



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow