Методы для реализации - хешируют на изменяемых объектах Какао

Объявление списков с помощью [] не будет работать. Но вы можете использовать заключенные в скобки списки инициализаторов :

double b[] = {1.0, 2.0};
double c[] = {5.3, 4.7};
Foo f = Foo(1, b, c);

Заметьте, однако, что вы не можете сделать это:

Foo f = Foo(1, {1.0, 2.0}, {5.3, 4.7});

Почему? Потому что списки инициализатора не могут конвертировать встроенные в массивы. Вы должны объявить массивы явно. Если вы хотите сделать это встроенным, используйте std::vector.

12
задан Lily Ballard 14 January 2009 в 15:56
поделиться

4 ответа

Интересный вопрос, но я думаю, что Вы хотите, логически невозможно. Скажите, что Вы запускаете с 2 объектов, A и B. Они и отличаются, и они запускают с различных хэш-кодов. Вы добавляете обоих к некоторой хеш-таблице. Теперь, Вы хотите видоизменить A, но Вы не можете изменить хэш-код, потому что это уже находится в таблице. Однако возможно измениться таким способом который это .equals () B.

В этом случае у Вас есть 2 варианта, ни один из которых не работает:

  1. Измените хэш-код для равенства B.hashcode, который нарушает ограничение не изменения хэш-кодов в то время как в хеш-таблице.
  2. Не изменяйте хэш-код, в этом случае A.equals (B), но у них нет тех же хэш-кодов.

Мне кажется, что нет никакого возможного способа сделать это, не используя константу в качестве хэш-кода.

3
ответ дан 2 December 2019 в 23:51
поделиться

Мое чтение документации состоит в том что значение изменяемого объекта для hash может (и вероятно должен), изменение, когда оно видоизменено, но не должен изменяться, когда объект не был видоизменен. Часть документации, к которой можно обратиться, поэтому, говорит, "Не видоизменяют объекты, которые хранятся в наборе, потому что это вызовет их hash оцените изменению."

Заключить в кавычки непосредственно из документации NSObject для hash:

Если изменяемый объект добавляется к набору, который использует значения хэш-функции для определения положения объекта в наборе, значение, возвращенное методом хеша объекта, не должно изменяться, в то время как объект находится в наборе. Поэтому или метод хеша не должен полагаться ни на одну информацию о внутреннем состоянии объекта, или необходимо удостовериться, что информация о внутреннем состоянии объекта не изменяется, в то время как объект находится в наборе.

(Шахта Emphasis.)

2
ответ дан 2 December 2019 в 23:51
поделиться

Так как Вы уже переопределяете-isEqual: чтобы сделать основанное на значении сравнение, действительно ли Вы уверены, что действительно необходимо обеспокоиться - хеш?

Я не могу предположить то, для чего точно Вы нуждаетесь в этом, конечно, но если Вы хотите сделать основанное на значении сравнение, не отклоняясь от ожидаемой реализации-isEqual: чтобы только возвратить ДА, когда хеши идентичны лучший подход мог бы быть должен имитировать-isEqualToString NSSTRING: так для создания собственного-isEqualToFoo: метод вместо того, чтобы использовать или переопределить-isEqual:.

0
ответ дан 2 December 2019 в 23:51
поделиться

В Java большинство изменяемых классов просто не переопределяет Object.hashCode () так, чтобы реализация по умолчанию возвратила значение, которое основано на адресе объекта и не изменяется. Это могло бы просто быть то же с Objective C.

-2
ответ дан 2 December 2019 в 23:51
поделиться