Spec-Zone.ru › Ada 2005
Справочник по Ada 2005

3.8 Типы записей

Объект записи — это составной объект, состоящий из именованных компонентов. Значение объекта записи — это составное значение, состоящее из значений компонентов.

Синтаксис

record_type_definition ::= [[abstract] tagged] [limited] record_definition
record_definition ::=
record
component_list
end record
| null record
component_list ::=
component_item {component_item}
| {component_item} variant_part
| null;
component_item ::= component_declaration | aspect_clause
component_declaration ::=
defining_identifier_list : component_definition [:= default_expression];

Правила разрешения имен

Ожидаемый тип для default_expression, если таковой имеется, в component_declaration — это тип компонента.

Правила легальности

Этот абзац был удален.
Каждый component_declaration объявляет компонент типа записи. Помимо компонентов, объявленных с помощью component_declarationов, компоненты типа записи включают любые компоненты, объявленные discriminant_specificationами объявления типа записи. Идентификаторы всех компонентов типа записи должны быть различными.
Внутри type_declaration имя, обозначающее компонент, защищенную подпрограмму или вход, разрешено только в следующих случаях:
  • Имя, обозначающее любой компонент, защищенную подпрограмму или вход, разрешено внутри элемента представления, который встречается в объявлении составного типа.
  • Имя, обозначающее не унаследованный дискриминант, разрешено внутри объявления типа, но не внутри discriminant_part. Если дискриминант используется для определения ограничения компонента, границ семейства входов или ограничения родительского подтипа в derived_type_definition, то его имя должно появляться отдельно как direct_name (не как часть более крупного выражения или расширенного имени). Дискриминант не должен использоваться для определения ограничения скалярного компонента.
Если имя текущего экземпляра типа (см. 8.6) используется для определения ограничения компонента, то оно должно появляться как direct_name, являющийся prefix ссылки на атрибут, результат которой имеет тип доступа, и ссылка на атрибут должна появляться отдельно.

Статическая семантика

Если объявление record_type_definition включает зарезервированное слово limited, тип называется явным ограниченным типом записи.
component_definition component_declaration определяет (номинальный) подтип компонента. Если зарезервированное слово aliased появляется в component_definition, то компонент является алиасом (см. 3.10).
Если component_list типа записи определен зарезервированным словом null и дискриминантов нет, то тип записи не имеет компонентов, и все записи типа являются записями null. record_definition типа null record эквивалентна record null; end record.

Динамическая семантика

Выполнение record_type_definition создаёт тип записи и его первый подтип и состоит из выполнения record_definition. Выполнение record_definition состоит из выполнения его component_list, если таковой имеется.
Выполнение component_list состоит из выполнения component_itemов и variant_part, если таковой имеется, в порядке их появления. Выполнение component_declaration состоит из выполнения component_definition.
Внутри определения составного типа, если component_definition или discrete_subtype_definition (см. 9.5.2) включает имя, обозначающее дискриминант типа, или является ссылкой на атрибут, префикс которой обозначает текущий экземпляр типа, то выражение, содержащее имя, называется выражением по объекту, а определяемое ограничение или диапазон называется ограничением по объекту. Для выполнения component_definition component_declaration или discrete_subtype_definition entry_declaration семейства входов (см. 9.5.2), если подтип компонента определяется с помощью access_definition, или если ограничение или диапазон subtype_indication или discrete_subtype_definition не является ограничением по объекту, то access_definition, subtype_indication или discrete_subtype_definition выполняются. В противном случае, если ограничение или диапазон является ограничением по объекту, то выполнение состоит из вычисления любых включенных выражений, которые не являются частью выражения по объекту. Каждое такое выражение вычисляется один раз, если оно не является частью именованной ассоциации в ограничении дискриминанта, в этом случае оно вычисляется один раз для каждого связанного дискриминанта.
При выполнении ограничения по объекту (как части создания объекта) каждое выражение по объекту ограничения вычисляется. Для других выражений используются значения, определенные во время выполнения component_definition или entry_declaration. Выполняются любые проверки, связанные с окружающим subtype_indication или discrete_subtype_definition, включая проверку совместимости подтипов (см. 3.2.2), и создается соответствующий подтип.
ПРИМЕЧАНИЯ
57 Объявление component_declaration с несколькими идентификаторами эквивалентно последовательности отдельных component_declarationов, как объясняется в 3.3.1.
58 default_expression компонента записи вычисляется только при создании объекта записи с инициализацией по умолчанию (предполагая, что объект имеет компонент, если он находится в variant_part — см. 3.3.1).
59 Тип подтипа, определяемый component_definition (см. 3.6), должен быть определённым подтипом.
60 Если у типа записи нет variant_part, то те же компоненты присутствуют во всех значениях типа.
61 Тип записи является ограниченным, если в его определении используется зарезервированное слово limited или если любой из его компонентов ограничен (см. 7.5).
62 Предопределённые операции типа записи включают проверку на принадлежность, квалификацию и явное преобразование. Если тип записи неограничен, они также включают присваивание и предопределённые операторы равенства.
63 Компоненту записи можно присвоить имя с помощью selected_component. Значение записи можно указать с помощью record_aggregate.

Примеры

Примеры объявлений типов записей:
type Date is
record
Day : Integer range 1 .. 31;
Month : Month_Name;
Year : Integer range 0 .. 4000;
end record;
type Complex is
record
Re : Real := 0.0;
Im : Real := 0.0;
end record;
Примеры переменных записей:
Tomorrow, Yesterday : Date;
A, B, C : Complex;
-- оба компонента A, B и C неявно инициализируются нулём


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API