В языке Carbon нет оператора switch, но есть match. match - это поток управления, похожий на switch из C и C++ и отражающий аналогичные конструкции в других языках, таких как Swift.
Введение
match имеет такую структуру:
match (expression) {
case value => {
...
break;
}
default => {
...
break;
}
}
Здесь необходимо понять несколько моментов.
- Выражение может быть передано для поиска внутри круглых скобок. Это может быть функция, возвращающая несколько значений.
- case использует опровержимый шаблон. Его значение сопоставляется со значением выражения. Это может быть несколько значений с кортежами или другими структурами данных.
- Как вариант, после значения case можно также использовать оператор if для сопоставления.
- Значения сопоставляются сверху вниз в каждом случае.
- Если ни одно из них не совпадает, то выполняется функция по умолчанию.
Пример
fn Bar() -> (i32, (f32, f32));
fn Foo() -> f32 {
match (Bar()) {
case (42, (x: f32, y: f32)) => {
return x - y;
}
case (p: i32, (x: f32, _: f32)) if (p < 13) => {
return p * x;
}
case (p: i32, _: auto) if (p > 3) => {
return p * Pi;
}
default => {
return Pi;
}
}
}
Здесь мы объявили две функции - Foo() и Bar().
Bar() используется для выражения соответствия. Она возвращает кортеж из 32-битного целого числа и кортеж из 32-битных плавающих чисел.
Foo() имеет условное соответствие и возвращает 32-битное целое значение.
Давайте разберемся в случаях совпадения.
1. Bar() возвращает -> (i32, (f32, f32)). Это означает, что случай должен совпадать с кортежем. Что-то вроде этого:
case (12, (15.0, 18.5)) => {}
2. Но можно просто сопоставить 1 значение и отбросить другие значения или сохранить их в переменных. Например, так:
case (12, (x: f32, y: f32)) => {}
3. Также возможно полностью отбросить значение:
case (12, _: auto) => {}
4. Вы можете хранить значения в переменной, а затем проверять условия с помощью if, например, так:
case (a: i32, (x: f32, y: f32)) if(a > 12 или x == y) => {}
5. Все значения, хранящиеся в переменных, доступны телу case. Таким образом, a, x, y могут быть использованы для вычислений внутри case.