Поиск…


замечания

Согласование шаблонов - это процесс разветвления в зависимости от предоставленных шаблонов. Все сопоставления с образцом выполняются внутри выражения switch , а отдельные выражения case представляют шаблоны.

Основные правила сопоставления шаблонов:

  • шаблоны всегда будут сопоставляться сверху донизу;
  • самый верхний шаблон, который соответствует входному значению, выполняет свое выражение;
  • a _ соответствует всем, поэтому case _: равен по default:

Когда обрабатываются все возможные случаи, шаблон catch-all _ или случай по default не требуется.

Согласование соответствия

Предположим следующее перечисление:

enum Operation {
    Multiply(left : Int, right : Int);
}

Согласование переходов можно выполнить следующим образом:

var result = switch(Multiply(1, 3)) {
    case Multiply(_, 0):
        0;
    case Multiply(0, _):
        0;
    case Multiply(l, r):
        l * r;
}

Рекомендации

Сопоставление структуры

Предположим, что следующая структура:

var dog = {
    name : "Woofer",
    age : 7
};

Согласование переходов можно выполнить следующим образом:

var message = switch(dog) {
    case { name : "Woofer" }:
        "I know you, Woofer!";
    case _:
        "I don't know you, sorry!";
}

Рекомендации

Соответствие массива

var result = switch([1, 6]) {
    case [2, _]:
        "0";
    case [_, 6]:
        "1";
    case []:
        "2";
    case [_, _, _]:
        "3";
    case _:
        "4";
}

Рекомендации

Или шаблоны

| оператор может использоваться в любом месте шаблонов для описания нескольких принятых шаблонов. Если в or-pattern имеется захваченная переменная, она должна отображаться в обоих под-образцах.

var match = switch(7) {
    case 4 | 1: "0";
    case 6 | 7: "1";
    case _: "2";
}

Рекомендации

гвардия

Также возможно дальнейшее ограничение шаблонов с помощью защитных устройств. Они определяются case ... if(condition): синтаксис.

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";
}

Рекомендации

Экстракторы

Экстракторы идентифицируются выражением extractorExpression => match . Экстракторы состоят из двух частей, разделенных оператором => .

  1. Левая сторона может быть любым выражением, где все вхождения символа подчеркивания _ заменяются текущим совпадающим значением.
  2. Правая сторона - это шаблон, который сопоставляется с результатом оценки левой стороны.

Так как правая сторона является шаблоном, она может содержать другой экстрактор. Следующий пример «цепочки» двух экстракторов:

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;
}

В настоящее время невозможно использовать экстракторы внутри или-шаблонов. Тем не менее, можно иметь или-шаблоны с правой стороны экстрактора.

Рекомендации



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow