Spec-Zone.ru › Ada 2012
Справочное руководство по Ada 2012

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

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

Синтаксис

record_type_definition ::= [[абстрактный] меченый] [ограниченный] record_definition
record_definition ::=
record
component_list
end record
| запись null
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];

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

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

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

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

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

Если record_type_definition включает зарезервированное слово ограниченный, тип называется типом явной ограниченной записи.
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 component_declaration или discrete_subtype_definition входа семейства входов (см. 9.5.2), если подтип компонента определяется access_definition, или если constraint или range subtype_indication или discrete_subtype_definition не является ограничением по объекту, тогда access_definition, subtype_indication или discrete_subtype_definition выполняются. С другой стороны, если constraint или range является ограничением по объекту, то выполнение состоит из вычисления любых включённых выражений, которые не являются частью выражения по объекту. Каждое такое выражение вычисляется один раз, если оно не является частью именованной ассоциации в ограничении дискриминанта, в этом случае оно вычисляется один раз для каждого связанного дискриминанта.
При выполнении ограничения по объекту (как части создания объекта) каждое выражение по объекту ограничения вычисляется. Для других выражений используются значения, определённые во время выполнения component_definition или entry_declaration. Любые проверки, связанные с окружающим subtype_indication или discrete_subtype_definition выполняются, включая проверку совместимости подтипов (см. 3.2.2), и соответствующий подтип создаётся.
ПРИМЕЧАНИЯ
63 Компонент component_declaration с несколькими идентификаторами эквивалентен последовательности отдельных component_declarationов, как поясняется в 3.3.1.
64 default_expression компонента записи вычисляется только при создании объекта типа записи с инициализацией по умолчанию (предполагая, что объект содержит этот компонент, если он находится в variant_part — см. 3.3.1).
65 Подтип, определённый component_definition (см. 3.6), должен быть определённым подтипом.
66 Если тип записи не имеет variant_part, то те же компоненты присутствуют во всех значениях типа.
67 Тип записи является ограниченным, если в его определении используется зарезервированное слово limited, или если любой из его компонентов является ограниченным (см. 7.5).
68 Предопределённые операции типа записи включают проверку принадлежности, квалификацию и явное преобразование. Если тип записи не ограничен, они также включают присваивание и предопределённые операторы равенства.
69 Компонент записи можно назвать с помощью 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