Кортежи

Кортеж хранит несколько связанных значений, которые могут иметь разные типы.

Создание кортежа

Например, сохраним в кортеже имя и возраст человека:

begin
  var person := ('Анна', 20);
  Println(person);
  Println(person.Item1, person.Item2);
end.

Результат:

(Анна, 20)
Анна 20

Распаковка

Кортеж можно распаковать в переменные

begin
  var point := (12, 7);
  var (x,y) := point;
  Println($'x = {x}, y = {y}');
end.

Результат:

x = 12, y = 7

Обмен значений переменных

Кортежное присваивание позволяет поменять значения двух переменных без дополнительной переменной.

begin
  var a := 5;
  var b := 12;

  (a,b) := (b,a);

  Println(a,b);
end.

Результат:

12 5

Циклический сдвиг переменных

С помощью кортежного присваивания можно одновременно циклически переставить значения нескольких переменных.

begin
  var a := 1;
  var b := 2;
  var c := 3;

  (a,b,c) := (b,c,a);

  Println(a,b,c);
end.

Результат:

2 3 1

Явный тип кортежа

Тип кортежа можно указать явно, перечислив типы его элементов.

begin
  var t: (string,integer) := ('Иванов',18);

  Println(t.Item1,t.Item2);
end.

Результат:

Иванов 18

Сравнение кортежей

Кортежи сравниваются лексикографически: сначала сравниваются первые элементы, при их равенстве — вторые и т. д.

begin
  var p1 := (2,5);
  var p2 := (3,1);

  Println(p1 < p2, p1 = p2);
end.

Результат:

True False

Функция, возвращающая кортеж

Можно определить функцию, возвращающую кортеж. Ее результат следует распаковать в переменные:

function MinMax(a,b: integer) 
  := if a < b then (a,b) else (b,a);

begin
  var (a,b) := ReadInteger2;
  var (min,max) := MinMax(a,b);
  Println(min,max);
end.

Массив кортежей

Кортежи удобно использовать для хранения небольших связанных наборов данных.

begin
  var people := [('Анна', 20), ('Иван', 18), ('Олег', 22)];

  foreach var (name, age) in people do
    Println(name, age);
end.

Алгоритм Евклида

Кортежное присваивание позволяет компактно записать алгоритм Евклида нахождения наибольшего общего делителя двух чисел.

begin
  var (a,b) := ReadInteger2;

  while b <> 0 do
    (a,b) := (b,a mod b);

  Println(a);
end.

Если введены числа:

48 18

Результат:

6