Язык:
Русский
English
Константы типа записей
Объявление константы типа записи содержит идентификатор и значение каждого поля записи.
Поля должны быть определены в том же порядке, в котором они были объявлены при определении типа записи.
■ Если запись содержит поля файлового типа, то константы такого типа
записи не могут быть объявлены.
■ Если запись содержит вариант, то определены могут быть только поля
указанного варианта.
■ Если вариант содержит поле метки, то её значение должно быть задано.
Примеры
type
Point = record
X, Y : Real;
end;
Vector = array[0 .. 1] of Point;
Month = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Date = record
D : range 1 .. 31;
M : Month;
Y : 1900 .. 2020;
end;
const
Origin : Point = (X : 0.0; Y : 0.0);
Line : Vector = ((X : -3.1; Y : 1.5), (X : 5.8; Y : 3.0));
SomeDay : Date = (D : 2; M : Dec; Y : 1960);
Ада
type Point is record
X, Y : Float;
end record;
type Vector is array (0 .. 1) of Point;
type Month is (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
type Date is record
D : Natural range 1 .. 31;
M : Month;
Y : Natural range 1900 .. 2020;
end record;
Origin : Point := (X | Y => 0.0);
Line : Vector := ((Y => 1.5, X => -3.1), (Y => 3.0, others => 5.8));
Some_Date : Date := (2, Dec, 1960);
Агрегаты (так они называются в языке Ада) можно использовать не только при инициализации констант, но и вообще в любых выражениях. В ЛЮБЫХ!
function "-" (Left, Right : Point) return Point is
begin
return (X => Right.X - Left.X, Y => Right.Y - Left.Y);
end "-";
Line_Diff : Point := Line (1) - Line (0);
Иногда агрегат может быть воспринят компилятором двояко, и в этом случае нужно явно указывать тип с помощью конструкции тип'(значение). Например:
Point'(2.0, 3.0)
будет всегда воспринято однозначно. В приведённом выше примере тип указывать не потребовалось, потому что сопоставление типов в языке Ада производится не только снизу вверх, но и сверху вниз. Функция "-" может вернуть только значение выражения типа Point, поэтому указание типа было необязательно.
Одним из следствием двустороннего сопоставления типов является возможность перегружать функции не только по типу аргументов, но и по типу результата.
Внутри агрегатов указание названия полей необязательно, но настоятельно рекомендуется для повышения читабельности. Если не указывать названия полей, то компилятор будет ожидать их в том порядке, в каком они были перечислены в объявлении записи. Внутри агрегата могут быть заданы и безымянные, и именованные поля, но именованные должны обязательно следовать за безымянными:
Date'(2, Dec, Y => 1960)
Поля внутри агрегата можно перечислять в любом порядке. Задать значение сразу нескольким именованным полям можно, перечислив их названия через | (знак трубы):
Point'(X | Y => 0.0)
Также можно в конце списка использовать зарезервированное слово others, чтобы задать значение оставшимся полям:
Point'(Y => 3.0, others => 5.8)
Лексема <> означает значение по умолчанию.