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, quindi case _: è uguale al default:

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

  1. Il lato sinistro può essere qualsiasi espressione, in cui tutte le occorrenze di underscore _ vengono sostituite con il valore correntemente corrisposto.
  2. 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.

Riferimenti



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow