Кортежи
Кортеж хранит несколько связанных значений, которые могут иметь разные типы.
Создание кортежа
Например, сохраним в кортеже имя и возраст человека:
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