|
|
|||||
Регистрация: Jul 2007
Адрес: Россия, Москва
Сообщений: 522
|
Очень «строгая» проверка объектов
Всем привет)
Появилась необходимость в сравнении 2 объектов на полную идентичность, т.е. на то, что они ссылаются на один и тот же фрагмент в памяти. Не знаю, возможно ли такое в AS3, но постараюсь объяснить, как это должно работать: // Задаём начальные данные var obj1:Object = { prop: 1 }; var obj2:Object = { prop: 1 }; var obj3:Object = { prop: obj1.prop }; // Тут функция должна возвращать false checkObjectsIdentity(obj1.prop, obj2.prop) // Тут функция должна возвращать true checkObjectsIdentity(obj1.prop, obj3.prop) /** * Функция, которая должна проверять объекты на идентичность * (ссылание на 1 объект в памяти). * * @param object1 * @param object2 * * @return */ function checkObjectsIdentity(object1:*, object2:*):Boolean { // Тут происходит магия } Но всё-таки, возможно, кто-то сталкивался с подобной задачей и сможет подсказать решение. За ранее спасибо) |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Другими словами, Вы хотите сравнивать переменные, то есть ссылки. Но Ваша функция не получает ссылок. Она получает просто значения — единички. И эти значения никак не могут быть неравны. Добавлено через 12 минут Не говоря уже о том, что prop в obj3 вовсе не собирается хранить ссылку на obj1 и его prop, а просто сохраняет значение: var obj1:Object = { prop: 1 }; var obj2:Object = { prop: 1 }; var obj3:Object = { prop: obj1.prop }; obj1.prop = 5; trace(obj3.prop); // output: 1 Решение для первого случая — передавать ссылки на объекты и строковые имена ключей. В функции сравнивать И объекты, и значения ключей function checkObjectsIdentity(object1:*, propName1:String, object2:*, propName2:String):Boolean { // Тут происходит магия return object1 === object2 && object1[propName1] === object2[propName2]; } Добавлено через 23 минуты Да и в первом случае все не так гладко)) Мы получим true при таком раскладе:
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 13.08.2012 в 02:35. |
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Цитата:
А что касается "магии", то она очень проста. Пишете контрольный перечень свойств объекта-1 и меняете их по определенному правилу, если у объекта-2 они так же изменились - значит да, это один объект. Потом свойства откручиваете в состояние до проверки. Но на мой взгляд это костыль. Типа, если телега доехала до моста, проверяем, есть ли у нее колеса, если колес нет, ставим дефолтные. |
|
|||||
|
|
|||||
Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
|
Есть ещё один способ, он странный и довольно медленный.
var o0:Object = {a:1}; var o1:Object = {a:1}; trace(getHashCode(o0) === getHashCode(o1));//false trace(getHashCode(o0));//@11d7fd49 trace(getHashCode(o1));//@11d7fd61 function getHashCode(obj:Object):String{ var result:String = ''; if(obj){ try { System(obj); } catch (e:Error) { result = String(e).replace(/.*([@|\$].*?) в .*$/gi, '$1'); if(result.length > 20){ result = String(e).replace(/.*([@|\$].*?) to .*$/gi, '$1'); } } }else{ result = 'null'; } return result; } |
Часовой пояс GMT +4, время: 15:23. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|