Поля повинні бути визначені в тому ж порядку, в якому вони були оголошені при визначенні типу записи.
# 9632; Якщо запис містить поля файлового типу. то константи такого типу
записи не можуть бути оголошені.
# 9632; Якщо запис містить варіант, то визначені можуть бути тільки поля
зазначеного варіанта.
# 9632; Якщо варіант містить поле мітки, то її значення повинно бути задано.
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;
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, тому вказівка типу було необов'язково.
Одним з наслідком двостороннього зіставлення типів є можливість перевантажувати функції не тільки за типом аргументів. але і за типом результату.
Date '(2, Dec, Y => 1960)
Поля всередині агрегату можна перераховувати в будь-якому порядку. Задати значення відразу декільком іменованих полів можна, перерахувавши їх назви через | (Знак труби):
Point '(X | Y => 0.0)
Також можна в кінці списку використовувати зарезервоване слово others, щоб задати значення залишилися полях:
Point '(Y => 3.0, others => 5.8)