Справочник Ada 2005
3.7.1 Ограничения по дискриминантам
discriminant_constraint задаёт значения дискриминантов для данного дискриминированного типа.
Синтаксис
discriminant_association ::=
[discriminant_selector_name {| discriminant_selector_name} =>] expression
[discriminant_selector_name {| discriminant_selector_name} =>] expression
discriminant_association называется именованной, если она содержит один или несколько discriminant_selector_nameов; в противном случае она называется позиционной. В discriminant_constraint любые позиционные ассоциации должны предшествовать любым именованным ассоциациям.
Правила разрешения имён
Каждый selector_name именованной discriminant_association должен ссылаться на дискриминант подтипа, к которому применяется ограничение; дискриминанты, указанные таким образом, являются связанными дискриминантами именованной ассоциации. Для позиционной ассоциации связанным дискриминантом является тот, чья discriminant_specification появилась в соответствующей позиции в known_discriminant_part, определяющей дискриминанты подтипа, к которому применяется ограничение.
Ожидаемый тип для expression в discriminant_association — тип соответствующего(их) связанного дискриминанта.
Правила допустимости
discriminant_constraint разрешён только в subtype_indication, у которой subtype_mark обозначает либо неограниченный дискриминированный подтип, либо неограниченный подтип доступа, у которого подтип назначения является неограниченным дискриминированным подтипом. Однако в случае подтипа доступа discriminant_constraint недопустим, если назначенный тип имеет частичный вид, ограниченный, или, для общего подтипа доступа, имеет default_expressionы для его дискриминантов. Помимо мест, где обычно применяются Правила допустимости (см. 12.3), эти правила применяются также в частях с private секцией экземпляра генерического блока. В генерическом теле это правило проверяется, предполагая, что все формальные типы доступа генерического блока могут быть общими типами доступа, а все формальные дискриминированные типы без тегов генерического блока могут иметь default_expressionы для своих дискриминантов.
Именованная discriminant_association с более чем одним selector_name разрешается только если все указанные дискриминанты имеют одинаковый тип. discriminant_constraint должен предоставлять ровно одно значение для каждого дискриминанта подтипа, к которому он применяется.
expression, связанная с дискриминантом доступа, должна быть типа, преобразуемого к анонимному типу доступа.
Динамические семантика
discriminant_constraint совместим с неограниченным дискриминированным подтипом, если каждое значение дискриминанта принадлежит подтипу соответствующего дискриминанта.
Составное значение удовлетворяет ограничению по дискриминантам тогда и только тогда, когда каждый дискриминант составного значения имеет значение, заданное ограничением по дискриминантам.
При обработке discriminant_constraint, expressionы в discriminant_associationы вычисляются в произвольном порядке и преобразуются к типу связанного дискриминанта (что может вызвать ошибку Constraint_Error — см. 4.6); expression именованной ассоциации вычисляется (и преобразуется) один раз для каждого связанного дискриминанта. Результат каждого вычисления и преобразования — значение, наложенное ограничением для связанного дискриминанта.
ПРИМЕЧАНИЯ
56 Правила языка гарантируют, что дискриминант объекта всегда имеет значение, либо из явного, либо из неявного инициализации.
Примеры
Примеры (используя типы, объявленные выше в разделе 3.7):
Large : Buffer(200); -- ограниченный, всегда 200 символов
-- (явное значение дискриминанта)
Message : Buffer; -- неограниченный, изначально 100 символов
-- (значение дискриминанта по умолчанию)
Basis : Square(5); -- ограниченный, всегда 5 на 5
Illegal : Square; -- недопустимо, Square должен быть ограничен
-- (явное значение дискриминанта)
Message : Buffer; -- неограниченный, изначально 100 символов
-- (значение дискриминанта по умолчанию)
Basis : Square(5); -- ограниченный, всегда 5 на 5
Illegal : Square; -- недопустимо, Square должен быть ограничен