Найти тему
Hello, World!

Сопоставление условий в языке Carbon

Оглавление

В языке 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.