Руководство по Ada (Ada 2022)
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 допустим только в том случае, если любое обращение к значению типа доступа известно как ограниченное (см. 3.3). В дополнение к местам, где обычно применяются правила допустимости (см. 12.3), эти правила применяются также в частях «private» экземпляра обобщенного блока.
Именованная discriminant_association с более чем одним selector_name допустима только в том случае, если все именованные дискриминанты имеют один и тот же тип. discriminant_constraint должен предоставлять ровно одно значение для каждого дискриминанта ограниченного подтипа.
Этот абзац был удален.
Динамическая семантика
discriminant_constraint совместим с неограниченным типизированным подтипом, если каждое значение дискриминанта принадлежит подтипу соответствующего дискриминанта.
Составное значение удовлетворяет ограничению дискриминанта тогда и только тогда, когда каждый дискриминант составного значения имеет значение, наложенное ограничением дискриминанта.
При обработке discriminant_constraint, expressionы в discriminant_association вычисляются в произвольном порядке и преобразуются к типу связанного дискриминанта (что может вызвать Constraint_Error — см. 4.6); expression именованной ассоциации вычисляется (и преобразуется) один раз для каждого связанного дискриминанта. Результат каждого вычисления и преобразования является значением, заданным ограничением для связанного дискриминанта.
ПРИМЕЧАНИЕ Правила языка гарантируют, что дискриминант объекта всегда имеет значение, либо из явного, либо из неявного инициализации.
Примеры
Примеры (используя типы, объявленные выше в 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 должен быть ограничен