Почему метод Контейнера ArrayCollection Flex использует ссылку на память? - PullRequest
5 голосов
/ 23 декабря 2008

При использовании .contains() на ArrayCollection во Flex он всегда будет смотреть на ссылку на память. Похоже, что он не смотрит на метод .equals(), метод .toString() или что-либо переопределенное. Вместо этого мне нужно каждый раз просматривать ArrayCollection и проверять каждый отдельный элемент, пока не найду то, что ищу.

Кто-нибудь знает, почему Flex / ActionScript был создан таким образом? Почему бы не дать людям возможность использовать метод contains() так, как они хотят?

Ответы [ 4 ]

2 голосов
/ 31 декабря 2008

Метод contains () выполняет поиск по ссылке, корректно (я полагаю, даже для примитивов), поэтому, если вы пытаетесь найти строку или целое число в ArrayCollection, вам придется выполнить поиск самостоятельно, с помощью некоторых вариация зацикливания или поиска. Я не думаю, что кто-либо из нас может сказать вам, почему, скажем, в этом методе нет необязательного параметра, указывающего, выполнять ли поиск по ref или val; так и идет, как говорится.

Но я бы определенно предупредил вас об исправлении кода в фреймворке - это просто напрашивается на неприятности. :)

2 голосов
/ 02 апреля 2009

Ну, похоже, ArrayCollection на самом деле смотрит не на память, а только в качестве крайней меры. Он попытается найти уникальный идентификатор (UID) для объекта. Если UID не существует, он создаст для него UIDUtil.as.

Вы можете обойти весь этот UID по умолчанию, если ваш объект реализует интерфейс IUID и предоставит свой собственный UID для объекта. ArrayCollection будет проверять UID, который вы предоставляете.

2 голосов
/ 27 декабря 2008

Не могли бы вы просто расширить ArrayCollection и переопределить метод contains ()? В качестве альтернативы вы можете вставить источник для ArrayCollection в пакет «mx / collection» в вашем проекте и изменить источник; эта «техника исправления обезьян» переопределит поведение на протяжении всего вашего проекта. Однако я бы очень осторожно относился к изменению ArrayCollection таким образом: поскольку он используется повсеместно в API-интерфейсах Flex, есть большая вероятность, что вы начнете ломать другие компоненты в рамках.

0 голосов
/ 10 февраля 2014

Я бы предложил простое:

in_array($haystack, $arrayCollection->toArray());
...