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

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

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

Синтаксис

record_type_definition ::= [[abstract] tagged] [limited] record_definition
record_definition ::=
record
component_list
end record [record_identifier]
| 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]
[aspect_specification];
Если record_identifier появляется в конце record_definition, он должен повторять defining_identifier окружающего full_type_declaration.

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

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

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

Этот абзац был удалён.
Каждый component_declaration объявляет компонент типа записи. Помимо компонентов, объявленных component_declarationами, компоненты типа записи включают любые компоненты, объявленные discriminant_specificationами объявления типа записи. Идентификаторы всех компонентов типа записи должны быть различными.
Внутри type_declaration имя, обозначающее компонент, защищённую подпрограмму или вход, типа разрешено только в следующих случаях:
  • Имя, обозначающее любой компонент, защищённую подпрограмму или вход, разрешено в aspect_specification, операционном элементе или элементе представления, которые встречаются в объявлении составного типа.
  • Имя, обозначающее не наследуемый дискриминант, разрешено в объявлении типа, но не в 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 для семейства входов (см. 9.5.2), если подтип компонента определяется с помощью access_definition или ограничение или диапазон subtype_indication или discrete_subtype_definition не является объектным ограничением, то выполняется access_definition, subtype_indication или discrete_subtype_definition. С другой стороны, если ограничение или диапазон является объектным ограничением, то выполнение состоит из вычисления любых включённых выражений, которые не являются частью выражения для объекта. Каждое такое выражение вычисляется один раз, за исключением случая, когда оно является частью именованного ассоциации в ограничении дискриминанта, в этом случае оно вычисляется один раз для каждого связанного дискриминанта.
При разработке ограничения на объект (как часть создания объекта), каждое выражение ограничения на объект оценивается. Для других выражений используются значения, определенные во время разработки определения_компонента или объявления_записи. Выполняются любые проверки, связанные с окружающим указанием_типа_подтипа или определением_дискретного_подтипа, включая проверку совместимости подтипов (см. 3.2.2), и создается связанный подтип.
ПРИМЕЧАНИЕ 1 объявление_компонента с несколькими идентификаторами эквивалентно последовательности отдельных объявлений_компонента, как описано в 3.3.1.
ПРИМЕЧАНИЕ 2 выражение_по_умолчанию компонента записи вычисляется только при создании объекта типа записи с инициализацией по умолчанию (предполагая, что объект имеет компонент, если он находится в части_варианта — см. 3.3.1).
ПРИМЕЧАНИЕ 3 Подтип, определенный определением_компонента (см. 3.6), должен быть определённым подтипом.
ПРИМЕЧАНИЕ 4 Если тип записи не имеет части_варианта, то те же компоненты присутствуют во всех значениях типа.
ПРИМЕЧАНИЕ 5 Тип записи ограничен, если в его определении есть ключевое слово limited, или если любой из его компонентов ограничен (см. 7.5).
ПРИМЕЧАНИЕ 6 Предопределённые операции типа записи включают проверку принадлежности, квалификацию и явное преобразование. Если тип записи неограничен, они также включают присваивание и предопределённые операторы равенства.
ПРИМЕЧАНИЕ 7 Компонент записи может быть назван с помощью выбранного_компонента. Значение записи может быть указано с помощью объединения_записи.

Примеры

Примеры объявлений типов записей:
тип Дата есть
запись
День : Целое диапазон 1 .. 31;
Месяц : Имя_месяца; -- см. 3.5.1
Год : Целое диапазон 0 .. 4000;
конец записи;
тип Комплексное есть
запись
Вещественная : Вещественное := 0.0;
Мнимая : Вещественное := 0.0;
конец записи Комплексное;
Примеры переменных записей:
Завтра, Вчера : Дата;
A, B, C : Комплексное;
-- оба компонента A, B и C неявно инициализированы нулём


Spec-Zone.ru

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