Ада-95. Компилятор GNAT

       

Агрегаты для записей


Так же как и в случае массива, все множество значений элементов записи может присваиваться с помощью агрегата. При этом агрегат должен предоставлять значения для всех компонентов записи даже в случаях когда некоторые компоненты обеспечены значениями по-умолчанию. Для записей различают агрегаты использующие позиционную, именованную и смешанную

нотацию.

Примером использования позиционного агрегата может служить следующее:

Expensive_Bike := (Aluminium, Cannondale, Cantilever, Cantilever);

При позиционной нотации порядок следования присваиваемых значений в агрегате соответствует порядку следования полей в описании типа записи.

Альтернативно позиционной нотации, показанной выше, для присваивания таких же значений полям переменной Expensive_Bike

можно применить агрегат использующий именованную нотацию. В этом случае поля записи могут перечисляться в произвольном порядке:

Expensive_Bike := ( Rear_Brake => Cantilever Front_Brake => Cantilever, Manufacturer => Cannondale, Frame => Aluminium, );

Для записей допускается смешивать в одном агрегате оба варианта нотации. При этом все позиционные значения должны предшествовать именованным значениям. Такой вариант нотации будет смешанным.



Также как и в случае агрегатов для массивов, в агрегатах для записей допускается использование опции others. При этом, для опции others должен быть представлен хотя бы один компонент, а в случае когда для опции others предоставляется более одного компонента, все компоненты должны иметь один и тот же тип.

Агрегаты являются удобным средством указания значений полей при описании переменных и констант:

Expensive_Bike : Bicycle := (Aluminium, Cannondale, Cantilever, Cantilever);

Одинаковые значения могут присваиваться разным полям записи при использовании символа '|'.

Expensive_Bike := ( Frame => Aluminium, Manufacturer => Cannondale, Front_Brake | Rear_Brake => Cantilever );

В заключение обсуждения применения агрегатов для записей рассмотрим следующий обобщающий пример:




type Summary is record

Field_1 : Boolean; Field_2 : Float; Field_3 : Integer; Field_4 : Integer; end record;

Variable_1 : Summary := (True, 10.0, 1, 1); -- позиционная нотация Variable_2 : Summary := ( -- именованная нотация Field_4 => 1 Field_3 => 1, Field_2 => 10.0, Field_1 => True ); Variable_2 : Summary := ( -- смешанная нотация True, 10.0, Field_4 => 1, Field_3 => 1 );

-------------------------- использование символа '|' Variable_4 : Summary := ( True, 10.0, Field_3|Field_4 => 1 ); Variable_5 : Summary := ( Field_1 => True, Field_2 => 10.0, Field_3|Field_4 => 1 );

-------------------------- использование others Variable_6 : Summary := (True, 10.0, others =&gt 1); Variable_7 : Summary := ( Field_1 => True, Field_2 => 10.0, others => 1 );


Содержание раздела