
Наиболее общее разделение отражает различие между семантикой указателей и
семантикой копирования. Многие языки используют эквивалентность указателей, когда
две ссылки на объект считаются эквивалентными, если они указывают на один и тот же
объект. Если мы рассмотрим слова «утренняя звезда» как указатель на Венеру, то при
такой интерпретации «утренняя звезда» эквивалентна «вечерней звезде». Эта форма
эквивалентности иногда называется эквивалентностью объектов.
Зачастую программист интересуется не столько тем, указывают ли две переменные на
идентичный объект, сколько тем, обладают ли два объекта одинаковым значением.
Последнее обычно требуется, например, при сравнении текстовых строк (рис. 12.3). Но
как должно определяться равенство значений? Для чисел и текстовых строк обычно под
равенством понимается побитное совпадение. При такой интерпретации два объекта
являются эквивалентными, если их битовое представление в памяти одинаково.
Для составных объектов вроде записей в языках Pascal и C побитное сравнение может
оказаться недостаточным. Часто блок памяти для таких типов данных может включать
пустые участки, которые не имеют отношения к значениям, хранимым в объекте.
Поскольку эти пропуски не должны учитываться при определении равенства,
используется второй механизм, а именно поэлементное равенство. При поэлементном
сравнении мы проверяем сопоставляемые элементы на совпадение, применяя это правило
рекурсивно, пока не встретится элемент, отличный от записи. В последнем случае
применяется побитное сравнение. Если все элементы удовлетворяют проверке, две записи
рассматриваются как равные друг другу. Если какие-либо два элемента не совпадают, то
записи не равны друг другу. Такое отношение равенства иногда называется структурной
эквивалентностью.
Техника объектно-ориентированного программирования привносит свои особенности в
проверку на равенство. Например, если при сравнении двух значений как статических
типов они оказываются равными, то при сравнении их в качестве динамических типов это
не обязательно так. Следует ли при проверке на равенство принимать это во внимание?
Что если один из типов определяет поля, которые отсутствуют в другом? Проблема
состоит также в том, что выбор интерпретации для вызываемого сообщения определяется
получателем. Нет гарантии, что такое фундаментальное свойство, как коммутативность,
будет сохраняться. Если идентификаторы x и y принадлежат к различным типам данных,
то вполне может быть, что отношение x=y справедливо, а отношение y=x — нет!
В одном аспекте, однако, проблему равенства легче решить, чем разобраться с
аналогичными трудностями при присваивании. Хотя последнее обычно рассматривается
как часть синтаксиса и семантики языка и в силу этого может быть неизменяемым,
программист всегда волен создать свои методы проверки на совпадение (возможно, с
несколько другим синтаксисом). Тем самым нет единого логического смысла отношения
равенства; оно может означать разные вещи для объектов разных классов.
Рис. 12.3. Идентичность и равенство текстовых строк
Техника объектно-ориентированного программирования привносит свои особенности в
проверку на равенство. Например, если при сравнении двух значений как статических
PDF created with pdfFactory Pro trial version www.pdffactory.com