Кортежи
Кортеж - это тип данных, являющийся разновидностью записи. Как и запись, кортеж представляет собой набор элементов разных типов. В отличие от записей, тип кортежей описывается очень просто. Кроме того, поля имеют предопределенные имена и являются неизменными: поменять поля кортежа после его создания невозможно.
Тип кортежа
Кортежи представляются типом System.Tuple платформы .NET:
var t: System.Tuple<string,integer>;
Для типа кортежа может быть использована сокращенная запись:
var t: (string,integer);
Данная запись похожа на объявление перечислимого типа. Если в круглых скобках - новые имена, то это перечислимый тип, а если имена типов, то это - тип кортежа.
Конструирование значений типа кортеж
Значения типа кортеж могут быть сконструированы в виде заключенного в круглые скобки перечисления составляющих кортеж значений через запятую. Например:
t := ('Иванов',23);
Для построенных таким образом значений работает автовыведение типа:
var t1 := ('Иванов',(5,3,4)); // кортеж, вторым
элементом которого является кортеж
Вывод кортежей
Как и при выводе записей, при выводе кортежей значения их элементов заключаются в круглые скобки и перечисляются через запятую:
writeln(t); // (Иванов,23)
writeln(t1); // (Иванов,(5,3,4))
Доступ к элементам кортежа
Элементы (поля) кортежа имеют имена Item1, Item2 и т.д.:
Print(t.Item1,t.Item2);
К элементам кортежа можно обращаться также по индексу:
Print(t[0],t[1]);
Индексы должны быть константными выражениями.
После создания кортеж неизменен: его поля нельзя менять:
t[1] := 20; // ошибка
Кортежное присваивание (распаковка кортежа в переменные)
Значения типа кортеж можно распаковать в переменные соответствующих типов, используя кортежное присваивание:
var t := ('Иванов',23);
var name:
string;
var age: integer;
(name,age) := t;
Последнее присваивание, где в левой части оператора присваивания используется заключенное в круглые скобки перечисление переменных, называется кортежным. Кортежное присваивание компилятор заменяет на несколько подряд идущих одиночных присваиваний:
name := t[0];
age := t[1];
С использованием кортежного присваивания меняется стиль программирования. Например, чтобы поменять местами значения двух переменных a и b, достаточно написать следующее кортежное присваивание:
(a,b) := (b,a);
В кортежном присваивании справа допускается количество элементов большее, чем количество переменных слева:
(a,b) := (1,2,3);
Кортежное присваивание можно совмещать с описанием переменных:
(var a, var b) := (1,2);
или
var (a,b) := (1,2);
Использование кортежей в функциях
Кортежи позволяют упаковывать несколько значений в одно. Это оказывается удобным если надо передавать несколько взаимосвязанных значений в качестве параметра или возвращать из функции несколько значений.
Например, функция, вычисляющая площадь и периметр прямоугольника, может быть записана в виде:
function SP(a,b: real) := (a*b,2*(a+b));
Чтобы воспользоваться результатом такой функции, удобно использовать распаковку кортежа в переменные с описанием:
var (S,P) := SP(2,3);