Rationale for Ada 2005: Structure and visibility
RUSTOPBACKNEXT
ENG |
4. Aggregates
@ There are important changes to aggregates in Ada 2005 which are very useful in a number of contexts. These were triggered by the changes to the rules for limited types which are described in the next section, but it is convenient to first consider aggregates separately. @ The main change is that the box notation <> is now permitted as the value in a named aggregate. @ The meaning is that the component of the aggregate takes the default value if there is one. @ So if we have a record type such as
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rationale for Ada 2005: Structure and visibility
@ENGRUSTOPBACKNEXT4. Агрегаты
@ Есть важные изменения для агрегатов в Аде 2005, которые очень полезны во многих контекстах. Они были вызваны изменениями к правилам для ограниченных типов, которые описаны в следующей секции, но удобно сначала рассмотреть агрегаты отдельно.
@ Основное изменение состоит в том, что замкнутый блок <> теперь разрешен как значение в именованном агрегате.
@ Он определяет то, что компонент агрегата берет значение по умолчанию, если он имеется.
@ Так, если у нас имеется некий тип записи:
|
@ тогда если мы напишем:
|
@ тогда X.A имеет значение 7, X.B - пустой указатель, а X.C не определенено. Таким образом, значеним по умолчанию назначается то, которое определяется в объявлении типа записи или, в отсутствии явного значения по умолчанию, это - значение по умолчанию для типа. Если нет никакого явного значения по умолчанию, и у типа нет одного ни одним тогда, значение просто неопределенно как обычно.
@ Вышеупомянутый пример мог быть сокращен к:
|
@ Очевидные комбинации возможны:
|
@ Последние два - эквивалентны. В Аде 95 есть правило, что, если нескольким компонентам записи в агрегате дают одно и то же выражение, используя символ | тогда, они должны иметь одинаковый тип. Это не применяется в случае <>, потому что никакое напечатанное выражение не вовлечено.
@ Нотация <> запрещена с позиционным назначением. Т.е. мы не можем написать:
|
@ Но мы можем смешать именованный и позиционный способ назначения в рекордном агрегате как обычно, если именованные компоненты следуют за позиционными, таким образом:
|
@ Небольшое, но важное правило состоит в том, что мы не можем использовать <> для компонента агрегата, который является дискриминантом, если у этого нет значения по умолчанию. Иначе мы могли закончить с неопределенным дискриминантом.
@ Нотация <> также разрешена с составными регулярными значениями. Но в этом случае ситуация намного более проста, потому что не возможно дать значение по умолчанию для компонентов массива. Таким образом, мы могли бы написать:
|
@ Первый элемент массива P имеет значение 2, а остальные неопределены. (Возможно P собирается использоваться, чтобы держать первые 1000 простых чисел, и у нас есть простой алгоритм, чтобы генерировать их, который требует, чтобы первое главное было предоставлено). агрегат мог также быть написан как:
|
@ Помните, что others разрешаетя с позиционным составным регулярным значением, если это в конец. Но иначе <> не разрешен с позиционным составным регулярным значением.
@ Мы можем добавить другие => <>, даже когда нет никаких компонентов слева. Это относится и к массивам и к записям.
@ Нотация <> также полезна с задачами и защищенными объектами, используемыми как компоненты. Рассмотрим:
|
@ Как объяснено в следующей секции, мы можем теперь использовать агрегат, чтобы инициализировать объект ограниченного типа. Хотя мы не можем дать явное начальное значение для Semaphore, мы все еще хотели бы использовать агрегат, чтобы получить проверку охвата. Таким образом, мы можем написать:
|
@ Отметим, что хотя мы можем использовать <> чтобы заместить значение компонента защищенного типа в записи, мы не можем использовать его для защищенного объекта, стоящего одиночно.
|
@ Причина состоит в том, что нет никакой потребности, так как у нас нет никакой проверки охвата, чтобы коснуться нас и не могло быть никакой другой причины для выполнения этого так или иначе.
@ Так же мы можем использовать <> с компонентом приватного типа как в:
|
@ но не стоящий одиночно:
|
@ Это не имеет никакого смысла, потому что такая переменная возьмет любое значение по умолчанию так или иначе.
@ Мы закончим небольшим курьёзным моментом. Рассмотрим:
|
@ Запись:
|
@ не совсем тоже самое что и:
|
@ В первом случае функция F не вызывается, тогда как во втором случае она вызывается при объявлении X для вычисления значения по умолчанию для X.A. Если бы у этого был противный побочный эффект тогда, то это могло бы иметь значение. Но тогда программисты не должны использовать противные побочные эффекты так или иначе.
2010-10-24 00:26:54
. .