Перейти к основному содержимому

Конструкция Match

Введение

Конструкция match является управляющей конструкцией для сопоставления одного значения с несколькими шаблонами. Она полезна, когда необходимо более четко выразить намерения по сравнению с if / else if цепочкой.

В текущей версии match в Wave является инструкцией и не поддерживается в виде выражения, возвращающего значения. Таким образом, var x = match (...) { ... } в таком виде использовать нельзя.


Основной синтаксис

match (value) {
pattern1 => {
// исполнительный блок
}
pattern2 => {
// исполнительный блок
}
_ => {
// блок по умолчанию
}
}

Правила синтаксиса:

  • Заголовок использует форму match (expr).
  • Каждая ветвь использует форму { ... }.
  • Вы можете использовать только разрывы строк между плечами или использовать , или ; в качестве разделителя.
  • Между ветвями могут быть пробелы, а в качестве разделителей можно использовать , или ;.

Типы шаблонов

На данный момент поддерживаются три типа шаблонов.

  1. Шаблон литерала целого числа
0 => { ... }
1 => { ... }
42 => { ... }
  1. Шаблон символа
Off => { ... }
On => { ... }

Шаблон символа используется для значений, которые можно интерпретировать как целочисленные константы, например, варианты перечислений (enum).

  1. Шаблон подстановки (_)
_ => { ... }

Это базовая ветвь, которая выполняется, когда нет совпадений с другими шаблонами.


Типы сопоставлений

В текущей версии, значения, которые могут быть сопоставлены в конструкции match, должны быть последовательностями целых чисел/enum. Строки, числовые нецелые числа и структуры не могут быть использованы в качестве аргументов для match.


Пример 1: Разбиение целых чисел

fun classify_num(v: i32) -> i32 {
var result: i32 = -1;

match (v) {
0 => {
result = 10;
}
1 => {
result = 20;
}
_ => {
result = 99;
}
}

return result;
}

Пример 2: Разбиение для enum

enum Mode -> i32 {
Off = 0,
On = 1,
Unknown = 2
}

fun classify_mode(m: Mode) -> i32 {
match (m) {
Off => {
return 1;
}
On => {
return 2;
}
_ => {
return 3;
}
}
}

Согласованные правила

  • Подобно последовательности switch, выполняется только одна согласованная ветвь.
  • Автоматического продолжения (fallthrough) нет.
  • Ветвь _ может использоваться только один раз как последняя.
  • Отсутствие ветви _ синтаксически допустимо. (Ни одна ветвь не выполняется, если нет совпадений)

Замечания

  1. Запрещение дублирования случаев
  • Если повторно использовать один и тот же случай, произойдет ошибка компиляции.
  1. Запрещение дублирования _
  • Ветвь _ нельзя объявлять более одного раза.
  1. Обязательный блок для ветви
  • После => необходимо использовать блок { ... }.
  1. Шаблоны должны быть константами
  • Шаблон символа используйте только для значений, которые можно интерпретировать как целочисленные константы/варианты перечислений.

Итог

Конструкция match в Wave — это оптимизированная для разбиения целых чисел/enum конструкция. Она использует синтаксис => + блок и позволяет создать блок по умолчанию через подстановку (_).

Она