Конструкция Match
Введение
Конструкция match является управляющей конструкцией для сопоставления одного значения с несколькими шаблонами.
Она полезна, когда необходимо более четко выразить намерения по сравнению с if / else if цепочкой.
В текущей версии match в Wave является инструкцией и не поддерживается в виде выражения, возвращающего значения.
Таким образом, var x = match (...) { ... } в таком виде использовать нельзя.
Основной синтаксис
match (value) {
pattern1 => {
// исполнительный блок
}
pattern2 => {
// исполнительный блок
}
_ => {
// блок по умолчанию
}
}
Правила синтаксиса:
- Заголовок использует форму
match (expr). - Каждая ветвь использует форму
{ ... }. - Вы можете использовать только разрывы строк между плечами или использовать
,или;в качестве разделителя. - Между ветвями могут быть пробелы, а в качестве разделителе й можно использовать
,или;.
Типы шаблонов
На данный момент поддерживаются три типа шаблонов.
- Шаблон литерала целого числа
0 => { ... }
1 => { ... }
42 => { ... }
- Шаблон символа
Off => { ... }
On => { ... }
Шаблон символа используется для значений, которые можно интерпретировать как целочисленные константы, например, варианты перечислений (enum).
- Шаблон подстановки (
_)
_ => { ... }
Это базовая ветвь, которая выполняется, когда нет совпадений с другими шаблонами.
Типы сопоставлений
В текущей версии, значения, которые могут быть сопоставлены в конструкции 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) нет.
- Ветвь
_может использоваться только один раз как последняя. - Отсутствие ветви
_синтаксически допустимо. (Ни одна ветвь не выполняется, если нет совпадений)
Замечания
- Запрещение дублирования случаев
- Если повторно использовать один и тот же случай, произойдет ошибка компиляции.
- Запрещение дублирования
_
- Ветвь
_нельзя объявлять более одного раза.
- Обязательный блок для ветви
- После
=>необходимо использовать блок{ ... }.
- Шаблоны должны быть константами
- Шаблон символа испо льзуйте только для значений, которые можно интерпретировать как целочисленные константы/варианты перечислений.
Итог
Конструкция match в Wave — это оптимизированная для разбиения целых чисел/enum конструкция.
Она использует синтаксис => + блок и позволяет создать блок по умолчанию через подстановку (_).
Она
