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

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 — это тип компонента.

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

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

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

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_items и variant_part, если таковые имеются, в порядке их появления. Выполнение component_declaration состоит из выполнения component_definition.
Внутри определения составного типа, если component_definition или discrete_subtype_definition (см. 9.5.2) включает имя, обозначающее дискриминант типа, или является attribute_reference, чья prefix обозначает текущий экземпляр типа, то выражение, содержащее имя, называется выражением на объект, а определяемое constraint или range называется ограничением на объект. Для выполнения component_definition объявления компонента или discrete_subtype_definition объявления входа семейства входов (см. 9.5.2), если constraint или range subtype_indication или discrete_subtype_definition не является ограничением на объект, то subtype_indication или discrete_subtype_definition выполняется. В противном случае, если constraint или range — ограничение на объект, то выполнение состоит из вычисления любого включенного выражения, которое не является частью выражения на объект. Каждое такое выражение вычисляется один раз, за исключением случаев, когда оно является частью именованной ассоциации в ограничении дискриминанта, в этом случае оно вычисляется один раз для каждого связанного дискриминанта.
При выполнении ограничения на объект (как части создания объекта), каждое выражение на объект ограничения вычисляется. Для других выражений используются значения, определенные во время выполнения component_definition или entry_declaration. Выполняются все проверки, связанные с содержащим subtype_indication или discrete_subtype_definition, включая проверку совместимости подтипов (см. 3.2.2), и создаётся соответствующий подтип.
ПРИМЕЧАНИЯ
55 component_declaration с несколькими идентификаторами эквивалентен последовательности отдельных component_declarations, как описано в 3.3.1.
56 default_expression компонента записи вычисляется только при создании инициализированного по умолчанию объекта типа записи (при условии, что объект содержит компонент, если он находится в variant_part — см. 3.3.1).
57 Подтип, определенный component_definition (см. 3.6), должен быть определенным подтипом.
58 Если тип записи не имеет variant_part, то те же компоненты присутствуют во всех значениях типа.
59 Тип записи является ограниченным, если в его определении есть ключевое слово limited или если любой из его компонентов является ограниченным (см. 7.5).
60 Предопределённые операции типа записи включают проверку на принадлежность, квалификацию и явное преобразование. Если тип записи неограниченный, они также включают присваивание и предопределённые операторы равенства.
61 Компонент записи может быть назван с помощью 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