Spec-Zone.ru › Ada 2005
Справочное руководство Ada 2005

4.5.2 Операторы отношения и проверки принадлежности

Операторы равенства = (равно) и /= (не равно) определены для типов без ограничений. Другие relational_operatorы — это операторы упорядочения < (меньше), <= (меньше или равно), > (больше) и >= (больше или равно). Операторы упорядочения определены для скалярных типов и для дискретных типов массивов, то есть одномерных массивов, компоненты которых являются дискретного типа.
Проверка принадлежности, используя in или not in, определяет, принадлежит ли значение заданному подтипу или диапазону, или имеет метку, идентифицирующую тип, который покрывается заданным типом. Проверки принадлежности разрешены для всех типов.

Правила разрешения имен

Тип проверяемого выражения в проверке принадлежности — это тип диапазона или тип, определённый subtype_markом. Если тип проверяется, то simple_expression должен разрешаться как тип, преобразуемый (см. 4.6) к типу проверяемого выражения; если немеченый, ожидаемый тип для simple_expression — это тип проверяемого выражения.

Правила легальности

Для проверки принадлежности, если simple_expression имеет тип меченного класса, то тип проверяемого выражения должен быть (видимо) помеченным.

Статическая семантика

Тип результата проверки принадлежности — это предопределённый тип Boolean.
Операторы равенства предопределены для каждого конкретного не ограниченного типа T, не являющегося анонимным типом доступа, со следующими спецификациями:
function "=" (Left, Right : T) return Boolean
function "/="(Left, Right : T) return Boolean
Следующие дополнительные операторы равенства для типа universal_access объявлены в пакете Standard для использования с анонимными типами доступа:
function "=" (Left, Right : universal_access) return Boolean
function "/="(Left, Right : universal_access) return Boolean
Операторы упорядочения предопределены для каждого конкретного скалярного типа T и для каждого дискретного типа массива T со следующими спецификациями:
function "<" (Left, Right : T) return Boolean
function "<="(Left, Right : T) return Boolean
function ">" (Left, Right : T) return Boolean
function ">="(Left, Right : T) return Boolean

Правила разрешения имен

По крайней мере один из операндов оператора равенства для universal_access должен быть конкретного анонимного типа доступа. За исключением случая, когда предопределённый оператор равенства идентифицируется с помощью расширенного имени с prefix, обозначающим пакет Standard, ни один операнд не должен быть типа доступа к объекту, назначенный тип которого D или D'Class, где D имеет пользовательский предопределённый оператор равенства, такой что:
  • его тип результата — Boolean;
  • он объявлен непосредственно в том же списке объявлений, что и D; и
  • по крайней мере один из его операндов — это параметр доступа с назначенным типом D.

Правила легальности

По крайней мере один из операндов операторов равенства для universal_access должен быть типа universal_access, или оба должны быть типов доступа к объектам, или оба должны быть типов доступа к подпрограммам. Кроме того:
  • Когда оба являются типами доступа к объектам, назначенные типы должны быть одинаковыми или один должен покрывать другой, а если назначенные типы являются элементарными или массивами, то назначенные подтипы должны статически соответствовать;
  • Когда оба являются типами доступа к подпрограммам, назначенные профили должны быть согласованы по подтипу.

Динамическая семантика

Для дискретных типов предопределённые операторы отношения определяются в терминах соответствующих математических операций над номерами позиций значений операндов.
Для вещественных типов предопределенные операторы отношения определяются в терминах соответствующих математических операций над значениями операндов, с учётом точности типа.
Два значения доступа к объектам равны, если они обозначают один и тот же объект или если оба равны нулевому значению типа доступа.
Два значения доступа к подпрограммам равны, если они являются результатом того же вычисления атрибута Access attribute_reference, или если оба равны нулевому значению типа доступа. Два значения доступа к подпрограммам не равны, если они обозначают разные подпрограммы. Не определено, равны ли или не равны два значения доступа, которые обозначают одну и ту же подпрограмму, но являются результатом разных вычислений атрибута Access attribute_reference.
Для расширения типа предопределённое равенство определяется в терминах примитивного (возможно, пользовательского) оператора равенства родительского типа и любых помеченных компонентов части расширения, а также предопределённого равенства для любых других компонентов, не унаследованных от родительского типа.
Для приватного типа, если его полный тип помечен, предопределенное равенство определяется в терминах примитивного оператора равенства полного типа; если полный тип не помечен, предопределенное равенство для приватного типа соответствует полному типу.
Для других составных типов предопределенные операторы равенства (и некоторые другие предопределенные операции над составными типами — см. 4.5.1 и 4.6) определяются в терминах соответствующей операции над соответствующими компонентами, определёнными следующим образом:
  • Для двух составных объектов или значений одного и того же не массивно типа соответствующие компоненты — те, которые соответствуют одному и тому же component_declaration или discriminant_specification;
  • Для двух одномерных массивов одного и того же типа, соответствующие компоненты — те (если таковые имеются), значения индексов которых совпадают в следующем смысле: нижние границы диапазонов индексов определены как совпадающие, а преемники соответствующих индексов определены как совпадающие;
  • Для двух многомерных массивов одного и того же типа, соответствующие компоненты — те, значения индексов которых совпадают в последовательных позициях индексов.
Аналогичные определения применяются, если типы двух объектов или значений преобразуемы, а не совпадают.
Учитывая вышеприведённое определение соответствующих компонентов, результат предопределённого оператора равенства для составных типов (кроме тех составных типов, которые рассматривались ранее) определяется следующим образом:
  • Если компонентов нет, результат определяется как True;
  • Если имеются не соответствующие компоненты, результат определяется как False;
  • В противном случае результат определяется в терминах примитивного оператора равенства для любых соответствующих помеченных компонентов и предопределённого равенства для любых соответствующих неопределённых компонентов.
Для любого составного типа порядок, в котором вызывается «=», для компонентов, не указан. Кроме того, если результат может быть определён до вызова «=» для некоторых компонентов, не указано, вызывается ли «=» для этих компонентов.
Предопределённый оператор "/=" даёт результат, обратный предопределённому оператору «=».
Для дискретного типа массива предопределённые операторы упорядочения соответствуют лексикографическому порядку, используя предопределённое отношение порядка типа компонентов: пустой массив лексикографически меньше любого массива, имеющего по крайней мере один компонент. В случае непустых массивов левый операнд лексикографически меньше правого операнда, если первый компонент левого операнда меньше, чем правого; в противном случае левый операнд лексикографически меньше правого операнда только в том случае, если их первые компоненты равны, и хвост левого операнда лексикографически меньше, чем правого (хвост состоит из оставшихся компонентов за первым и может быть пустым).
При оценке проверки принадлежности simple_expression и диапазон (если таковой имеется) оцениваются в произвольном порядке.
Проверка принадлежности с использованием in даёт результат True, если:
  • Тип проверяемого выражения — скалярный, и значение simple_expression принадлежит заданному диапазону или диапазону указанного подтипа; или
  • Тип проверяемого выражения не скалярный, и значение simple_expression удовлетворяет любым ограничениям указанного подтипа, и:
  • если тип simple_expression является общедоступным, значение имеет метку, которая идентифицирует тип, охватываемый проверяемым типом;
  • если проверяемый тип является типом доступа, а указанный подтип исключает null, значение simple_expression не равно null.
В противном случае тест возвращает результат False.
Тест на принадлежность, использующий not in, дает результат, обратный результату соответствующего теста на принадлежность с использованием in.

Требования к реализации

Для всех типов, объявленных в языковых пакетах, операторы "=" и "/=" типа должны вести себя так, как если бы они были предопределенными операторами равенства для целей равенства составных типов и формальных типов обобщений.
ПРИМЕЧАНИЯ
Этот абзац был удален.
13 Если составной тип имеет компоненты, которые зависят от дискриминантов, два значения этого типа имеют соответствующие компоненты тогда и только тогда, когда их дискриминанты равны. Два не-null массива имеют соответствующие компоненты, если и только если длина каждого измерения одинакова для обоих.

Примеры

Примеры выражений, включающих операторы сравнения и тесты на принадлежность:
X /= Y
"" < "A" and "A" < "Aa" -- True
"Aa" < "B" and "A" < "A " -- True
My_Car = null -- true, если My_Car было установлено в null (см. 3.10.1)
My_Car = Your_Car -- true, если у нас обеих одинаковая машина
My_Car.all = Your_Car.all -- true, если две машины идентичны
N not in 1 .. 10 -- тест на принадлежность к диапазону
Today in Mon .. Fri -- тест на принадлежность к диапазону
Today in Weekday -- тест на принадлежность к подтипу (см. 3.5.1)
Archive in Disk_Unit -- тест на принадлежность к подтипу (см. 3.8.1)
Tree.all in Addition'Class -- тест на принадлежность к классу (см. 3.9.1)


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API