«Машины должны работать. Люди должны думать»
10. Записи
Запись – это множество разнотипных элементов. Каждый элемент (поле) записи имеет свое собственное имя и тип. Синтаксис записей тот же, что и ВР.
Вариантные части записи.
Запись может иметь вариантную часть, которая должна следовать после обычных полей. Запись также может иметь только вариантную часть. Формат объявления записи с вариантной частью такой:
type
recordTypeName = record
fieldList 1 : type 1 ;
. . .
fieldList n : type n ;
case tag: ordinalType of
constantList 1 : (variant 1 );
. . .
constantList n : (variant n );
end;
В вариантной части:
селектор tag – не обязателен и может быть любым допустимым идентификатором. Если он опущен, то необходимо опустить и двоеточие после него;
ordinalType – идентификатор любого порядкового типа;
каждый constantList должен быть константой, списком разделенных запятыми констант или диапазоном. Тип констант должен быть порядковым; и никакая константа не может повторяться;
каждый variant является списком полей, разделенных запятыми, после которого должен следовать, через двоеточие, идентификатор типа полей. Список полей может состоять и из одного элемента.
Любой variant имеет следующий формат:
fieldList 1 : type 1 ;
. . .
fieldList n : type n ;
Здесь каждый fieldList – идентификатор или список идентификаторов, разделенных запятыми. Как и для «обычных» полей, тип type не должен быть:
long strings;
dynamic arrays;
variants (т.е. типом Variant);
интерфейсом interface;
никаким структурным типом, содержащим в качестве полей любой из перечисленных типов.
Вместе с тем, fieldList может содержать указатели на эти типы.
Идентификатор tag, если он есть, интерпретируется как обычное (дополнительное) поле в невариантной части записи.
Вариантные записи предназначены для достижения двух основных целей:
создания записи с полями разных типов, к которым не предполагается одновременный доступ;
интерпретации одних и тех же данных как имеющих различный тип. Эта цель достигается даже в том случае, когда компилятор не дает возможности выполнить приведение типа.
Первый пример:
type
TEmployee = record
FirstName, LastName: string[40];
BirthDate: TDate;
case Salaried: Boolean of
True: (AnnualSalary: Currency);
False: (HourlyWage: Currency);
end;
Идея такой записи в том, что любой служащий может иметь только один из двух видов оплат:годовой оклад (AnnualSalary) или почасовую оплату (HourlyWage).
Второй пример:
type
TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);
TFigure = record
case TShapeList of
Rectangle: (Height, Width: Real);
Triangle: (Side1, Side2, Angle: Real);
Circle: (Radius: Real);
Ellipse, Other: ();
end;
«9. Массивы»
11. Файловые типы