Оператор выбора выбирает для выполнения одну из нескольких альтернативных последовательностей операторов; выбор альтернативы осуществляется в зависимости от значения выражения.
оператор-выбора ::= case выражение is альтернатива-оператора-выбора {альтернатива - оператора - выбора} end case;альтернатива-оператора-выбора :: = when выбор { | выбор } => последовательность-операторов
Выражение должно быть дискретного типа, который должен быть определимым независимо от контекста выражения, но с учетом того факта, что тип выражения должен быть дискретным. Более того, тип этого выражения не должен быть настраиваемым формальным ти-
пом. Каждый выбор в альтернативе оператора выбора должен быть того же типа, что и выражение; перечень выборов определяет, для каких значений выражения выбирается соответствующая альтернатива.
Если выражение является именем объекта статического подтипа, то каждое значение этого подтипа должно быть представлено один и только один раз в наборе выборов оператора выбора и никакие другие значения недопустимы; это правило применяется также, если выражение является квалифицированным выражением или преобразованием типа, обозначение типа которого указывает статический подтип. В остальных случаях, для других форм выражения, каждое значение (базового) типа выражения должно быть представлено только один раз в наборе выборов и никакие другие значения недопустимы.
Используемые в качестве выборов в операторе выбора простые выражения и дискретные диапазоны должны быть статическими. Выбор, являющийся дискретным диапазоном, задает все значения из этого диапазона (ни одного значения в случае пустого диапазона). Выбор others допустим только в качестве единственного выбора для последней альтернативы и задает все значения (возможно, и ни одного), не приведенные в выборах предыдущих альтернатив. В качестве выбора в альтернативе оператора выбора не допускается использование простого имени компоненты.
Выполнение оператора выбора заключается в вычислении выражения, в выборе последовательности операторов и в выполнении выбранной последовательности операторов.
Примеры:
case SENSOR is when ELEVATION => RECORDELEVATION (SENSOR-VALUE); when AZIMUTH => RECORD.AZIMUTH (SENSOR-VALUE); when DISTANCE => RECORD-DISTANCE (SENSOR-VALUE); when others => null;end case;case TODAY is when MON => COMPUTE-INITIAL-BALANCE; when FRI => COMPUTE-CLOSING-BALANCE; when TUE .. THU => GENERATEREPORT(T-ODAY); when SAT .. SUN => null; end case;case BIN_NUMBER(COUNT) is when 1 => UPDATE_BIN(1); when 2 => UPDATE_BIN(2); when 3 | 4 => EMPTY_BIN(1); EMPTY_BIN(2); when others => raise ERROR; end case;
Примечание. При выполнении оператора выбора выбирается одна и только одна альтернатива, так как выборы являются исчерпывающими и взаимно исключающими. Квалификацией выражения в операторе выбора статическим подтипом можно ограничить количество выборов, которые необходимо указать явно.
Выбор others обязателен в операторе выбора, если выражение имеет тип универсальный-целый (например, выражение является целым литералом), так как это единственный способ учесть все значения типа универсальный-целый.
Ссылки: базовый тип 3.3, выбор 3.7.3, вызов функции 6.4, выражение 4.4, дискретный тип 3.5, имя 4.1, квалифицированное выражение 4.7, контекст разрешения совмещения 8.7, литерал перечисления 3.5.1, обозначение типа 3.3.2, объект 3.2.1, последовательность операторов 5.1, преобразование 4.6, преобразование типа 4.6, подтип 3.3, совмещение 6.6, 8.7, статический дискретный диапазон 4.9, статический подтип 4.9, тип 3.3, формальный тип настройки 12.1.