Агрегаты для массивов
В общем случае, агрегат массива - это совокупность значений для каждого элемента массива. Использование агрегатов позволяет выполнять одновременное присваивание значений всем элементам массива в эффективной и элегантной форме.
Рассмотрим следующий пример:
Store_1_Stock := (5, 4, 300); |
В данном случае, присваивание значений элементам массива Store_1_Stock
выполняется с помощью агрегата. Следует учесть, что в этом примере значения в агрегате присваиваются в порядке соответствующем следованию элементов в массиве. Такая нотация называется позиционной или неименованой, а такой агрегат - позиционный или неименованый агрегат.
Кроме позиционной нотации, возможно использование именованой нотации. В этом случае именуется каждый индивидуальный элемент массива. Используя именованую нотацию, предыдущий пример можно переписать следующим образом:
Store_1_Stock := (Dog => 5, Budgie => 4, Rabbit => 300); |
Такой вид агрегата называют именованым агрегатом.
Приведем еще один пример именованого агрегата:
Store_1_Stock := (Dog | Budgie => 0, Rabbit => 100); |
В пределах одного агрегата, Ада допускает использовать только один вид нотации. Это означает, что комбинирование позиционной и именованой нотации в одном агрегате - не допустимо и будет вызывать ошибку компиляции. Например:
Store_1_Stock := (5, 4, Rabbit => 300); -- это недопустимо! |
В агрегате может указываться диапазон дискретных значений:
Store_1_Stock := (Dog..Rabbit => 0); |
Агрегаты обоих видов удобно использовать в описаниях:
Store_1_Stock: Pet_Stock := (5, 4, 300); |
С агрегатами массивов разрешается использование опции others, которая практически полезна при установке всех элементов массива в какое-либо предопределенное значение. Стоит учесть, что в таких случаях часто требуется квалификация типа.
New_Shop_Stock : Pet_Stock := (others := 0); |
Рассмотрим следующие описания:
declare
type Numbers1 is array(1..10) of Integer; type Numbers2 is array(1..20) of Integer; A : Numbers1; B : Numbers2; begin A := (1, 2, 3, 4, others => 5); end; |
Заметьте, что в данном случае опция others используется вместе с позиционной нотацией. Поэтому Ада потребует указать квалификацию типа:
A : = Numbers1'(1, 2, 3, 4, others => 5); |
В общем случае, при использовании опции others совместно с любой из двух нотаций, позиционной или именованой, требуется указывать квалификацию типа.