Справочник по Ada 2005
3.8.1 Разделы вариантов и дискретные выборы
Тип записи с разделом_варианта определяет альтернативные списки компонентов. Каждый вариант определяет компоненты для значений или значений дискриминанта, охватываемых его списком_дискретных_выборов.
Синтаксис
Правила разрешения имен
дискриминант_прямое_имя должно разрешаться для обозначения дискриминанта (называемого дискриминантом раздела_варианта), указанного в разделе_известных_дискриминантов полного_объявления_типа, содержащем раздел_варианта. Ожидаемый тип для каждого дискретного_выбора в варианте — тип дискриминанта раздела_варианта.
Правила допустимости
Дискриминант раздела_варианта должен быть дискретного типа.
Выражения и дискретные_диапазоны, указанные как дискретные_выборы в разделе_варианта, должны быть статическими. Дискретный_выбор others должен появляться в списке_дискретных_выборов один раз, и такой список_дискретных_выборов, если он появляется, должен быть последним в содержащем его конструкте.
Дискретный_выбор определяется как покрывающий значение в следующих случаях:
- Дискретный_выбор, являющийся выражением, покрывает значение, если это значение равно значению выражения, преобразованному к ожидаемому типу.
- Дискретный_выбор, являющийся дискретным_диапазоном, покрывает все значения (возможно, ни одного), которые принадлежат диапазону.
- Дискретный_выбор others покрывает все значения ожидаемого типа, которые не покрываются предыдущими списками_дискретных_выборов того же конструкта.
Список_дискретных_выборов покрывает значение, если один из его дискретных_выборов покрывает это значение.
Возможные значения дискриминанта раздела_варианта должны быть покрыты следующим образом:
- Если дискриминант — статический ограниченный скалярный подтип, то каждый дискретный_выбор без others должен покрывать только значения в этом подтипе, и каждое значение этого подтипа должно быть покрыто каким-либо дискретным_выбором (явным или посредством others);
- Если тип дискриминанта является потомком родового формального скалярного типа, то раздел_варианта должен иметь дискретный_выбор others;
- В противном случае, каждое значение базового диапазона типа дискриминанта должно быть покрыто (явным образом или с помощью others).
Два различных дискретных_выбора раздела_варианта не должны покрывать одно и то же значение.
Статические семантики
Если список_компонентов варианта указан как null, вариант не имеет компонентов.
Дискриминант раздела_варианта называется управляющим разделом_варианта и его вариантов. Кроме того, дискриминант производного типа управляет разделом_варианта и его вариантов, если он соответствует (см. 3.7) дискриминанту раздела_варианта.
Динамические семантики
Значение записи содержит значения компонентов конкретного варианта только если значение управляющего дискриминанта варианта покрывается списком_дискретных_выборов варианта. Это правило применяется последовательно к любому последующему варианту, который сам включен в список_компонентов данного варианта.
Развертывание раздела_варианта состоит из развертывания списка_компонентов каждого варианта в порядке их появления.
Примеры
Пример типа записи с разделом вариантов:
type Device is (Printer, Disk, Drum);
type State is (Open, Closed);
type State is (Open, Closed);
type Peripheral(Unit : Device := Disk) is
record
Status : State;
case Unit is
when Printer =>
Line_Count : Integer range 1 .. Page_Size;
when others =>
Cylinder : Cylinder_Index;
Track : Track_Number;
end case;
end record;
record
Status : State;
case Unit is
when Printer =>
Line_Count : Integer range 1 .. Page_Size;
when others =>
Cylinder : Cylinder_Index;
Track : Track_Number;
end case;
end record;
Примеры подтипов записей:
subtype Drum_Unit is Peripheral(Drum);
subtype Disk_Unit is Peripheral(Disk);
subtype Disk_Unit is Peripheral(Disk);
Примеры ограниченных переменных записей:
Writer : Peripheral(Unit => Printer);
Archive : Disk_Unit;
Archive : Disk_Unit;