Подробнее о типах
Агрегаты: краткая информация
До сих пор мы говорили об агрегатах довольно мало и видели лишь ряд примеров. Теперь мы рассмотрим эту конструкцию более подробно.
Агрегат в Аде фактически является литералом составного типа. Это очень мощная форма записи во многих случаях позволяет избежать написания процедурного кода для инициализации структур данных.
Основным правилом при записи агрегатов является то, что каждый компонент массива или записи должен быть указан, даже компоненты, которые имеют значение по умолчанию.
Это означает, что следующий код неверен:
Существует несколько сокращений, которые можно использовать, чтобы сделать представление более удобным:
Чтобы задать значение по умолчанию для компоненты, можно использовать нотацию
<>
.Символ
|
можно использовать для присвоения нескольким компонентам одинакового значения.Вы можете использовать
others
вариант для ссылки на все компоненты, которые еще не были указаны, при условии, что все эти поля имеют одинаковый тип.Можно использовать нотацию диапазона
..
чтобы указать непрерывную последовательность индексов в массиве.
Однако следует отметить, что, как только вы использовали именованное сопоставление, все последующие компоненты также должны быть указаны с помощью именованного сопоставления.
Cовмещение и квалифицированные выражения
В Ада есть общая концепция совмещения имен, которую мы видели ранее в разделе о перечислимых типах.
Давайте возьмем простой пример: в Аде возможно иметь функции с одинаковым именем, но разными типами для их параметров.
Это распространенное понятие в языках программирования, называемое совмещением, или перегрузкой имен.
Одной из особенностей совмещения имен в Аде является возможность разрешить неоднозначности на основе типа возвращаемого функцией.
Attention
Заметим, что разрешение совмещения на основе типа в Аде работает как для функций, так и для литералов перечисления - вот почему у вас может быть несколько литералов перечисления с одинаковым именем. Семантически литерал перечисления рассматривается как функция, не имеющая параметров.
Однако иногда возникает двусмысленность из-за которой невозможно определить, к какому объявлению совмещенного имени относится данное употребление имени. Именно здесь становится полезным квалифицированное выражение.
Синтаксически квалифицированное выражение используется либо с выражением в круглых скобках, либо с агрегатом:
Это иллюстрирует, что квалифицированные выражения являются удобным (а иногда и необходимым) способом явно обозначить тип выражения и помочь, как компилятору, так и для другим программистам разобраться в коде.
Attention
Хотя преобразования типов и квалифицированные выражения выглядят и ощущаются похожими это не одно и тоже.
Квалифицированное выражение указывает точный тип, в котором следует трактовать выражение, в то время как преобразование типа попытается преобразовать значение и выдаст ошибку во время выполнения, если исходное значение не может быть преобразовано.
Обратите внимание, что вы можете использовать квалифицированное выражение для преобразования из одного подтипа в другой, с исключением, возникающим при нарушении ограничения.
X : Integer := Natural'(1);
Символьные типы
Как отмечалось ранее, каждый перечислимый тип отличается и несовместим с любым другим перечислимым типом. Однако ранее мы не упоминали, что символьные литералы разрешены в качестве литералов перечисления. Это означает, что в дополнение к стандартным символьным типам пользователь может определить свои символьные типы: