Разница между одинаковым и равным? - PullRequest
0 голосов
/ 25 января 2012

У меня возникают проблемы с пониманием концепции, когда две вещи равны, а две вещи идентичны.Что меня смущает, так это утверждение: «Два объекта могут быть идентичными, что означает, что они равны. Но два объекта, которые равны, не являются идентичными».Может ли кто-нибудь помочь мне понять разницу?Спасибо.

Ответы [ 3 ]

5 голосов
/ 25 января 2012

в target-c, слегка псевдокод ...

NSString * a = @"hello";
NSString * b = @"hello";

a == a    //they are identical (the same object)
[a isEqualToString:a]; //they are equal.
a != b    //Even though the string contents are the same they are not the same object.
[a isEqualToString:b]; // they aren't identical but they are equal.

Очень длинный и хороший пост в блоге на эту тему смотрите здесь

http://www.karlkraft.com/index.php/2008/01/07/equality-vs-identity/

2 голосов
/ 25 января 2012

Добро пожаловать в мир коробок ... (это работает намного лучше с фотографиями, извинения, которых я не включил)

Преамбула

Когда вынапишите:

int x;

вы запрашиваете ящик , который способен удерживать int и приравнивать имя этого к x - у всех ящиков есть внутреннее имя, не важно, что это такое.Поэтому теперь, когда вы пишете:

x = 4;

, вы просите сохранить значение 4 в поле , на которое ссылается имя x .Коробку часто называют «переменной».Это использование блоков, поэтому компьютерное программирование отличается от математики, вы можете написать:

x = x + 1;

в компьютерном программировании, но не в математике!Это означает «перейти к блоку, на который ссылается x , скопировать значение, добавить 1 к нему, поместить значение обратно в тот же блок».

Теперь поля разных типов (т.е.что может храниться в них) можно «склеить» вместе, чтобы сформировать многокамерные коробки.Вся коллекция называется одним именем, а отдельные блоки - двумя именами: одна для коллекции и одна для отдельной коробки.Такие коллекции коробок появляются на разных языках программирования под терминами «запись», «структура», «объект» и т. Д.

И, наконец, что вы можете поместить в коробку?Ответ (в зависимости от правил языка программирования): что-нибудь , и это включает в себя имена других полей .Например, вы можете написать:

int *y;

, который запрашивает ящик, способный содержать «имя ящика с целым числом», и называть этот ящик y .Такие поля часто называют «переменными указателя» или «ссылочными переменными»

== против isEqual

В Objective-C оператор == выглядитна содержимое двух блоков и определяет, содержат ли они одно и то же значение - и что значение вполне может быть именем другого блока.

Метод isEqualработает только для ящиков (определенных ограниченных типов), которые содержат имена других ящиков.Он просматривает два блока, использует имена в этих полях, чтобы найти еще два блока, а затем сравнивает содержимое этих блоков.Если сравниваемые блоки содержат другие блоки, содержащие имена еще дополнительных блоков, то он переходит к этим дополнительным блокам для их сравнения и т. Д.

Кроме того, isEqual не нужно сравнивать для точного равенства, норазрешено сравнивать для «означает то же самое».Например, если вы создаете два словаря, которые содержат одинаковые пары ключ / значение, но вводятся в разных порядках, то расположение блоков, составляющих эти два словаря, может не совпадать, но семантически они одинаковы - метод isEqualDictionary:определяется как:

Два словаря имеют одинаковое содержание, если в каждом из них содержится одинаковое количество записей, и для данного ключа соответствующие объекты значений в каждом словаре удовлетворяют критерию isEqual:.

Заключение

Оператор == обычно используется только для «примитивных» типов данных - int, float, NSInteger и т. Д. - иструктуры таких типов - например, NSRect.Это типы, в которых значения определяют равенство.

Метод isEqual: обычно используется для объектов Obj-C - вы обычно не хотите знать, содержат ли ящикито же имя (это то, что определяет ==), но является ли то, на что ссылаются эти имена, семантически эквивалентным - это то, что определяет isEqual:.

0 голосов
/ 25 января 2012

Обычно идентичные означают, что они являются одним и тем же объектом в памяти (занимают один и тот же объем памяти).Равный обычно означает, что значения их атрибутов одинаковы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...