PascalABC.NET

Кортежи

Кортеж - это тип данных, являющийся разновидностью записи. Как и запись, кортеж представляет собой набор элементов разных типов. В отличие от записей, тип кортежей описывается очень просто. Кроме того, поля имеют предопределенные имена и являются неизменными: поменять поля кортежа после его создания невозможно.

Тип кортежа

Кортежи представляются типом 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);