Отсутствие перегрузки операторов в ActionScript 3.0

Одна из вещей, по которым мне больше всего не хватает ActionScript, — это отсутствие перегрузки операторов, в частности ==. Я как бы обхожу эту проблему, добавляя метод «Сравнить» в свои классы, но во многих случаях это не помогает, например, когда вы хотите использовать такие вещи, как встроенный словарь.

Есть ли хороший способ обойти эту проблему?


person Andres    schedule 09.09.2008    source источник


Ответы (2)


Неа.

Но не помешает добавить equals методов в свои собственные классы. Я стараюсь никогда не использовать == при сравнении объектов (то же самое касается ===, что то же самое для объектов), так как он проверяет только идентификацию .

К сожалению, все коллекции во Flash и Flex предполагают, что идентичность — единственная необходимая мера равенства.

Во Flex есть намёки на то, что кто-то хотел в своё время облегчить эту проблему, но, похоже, от неё отказались: есть интерфейс под названием IUID и упоминается в Руководстве разработчика Flex , но нигде не используется. Даже коллекции в Flex не используют его для определения равенства. А так как вы спрашиваете решение для Flash, возможно, оно вам все равно не помогло.

Я еще кое-что написал об этом (в контексте Flex) в своем блоге: Разве нет равенства?.

person Theo    schedule 09.09.2008
comment
Это не проблема. Коллекции низкого уровня должны использовать равенство экземпляров. Любой другой тип проверки на равенство является совершенно произвольным и должен быть четко определен в методе equals. Должно быть совершенно очевидно, хотите ли вы равенство экземпляров или некоторую произвольную проверку равенства данных, когда вы что-то кодируете. В общем, единственный раз, когда вам может понадобиться проверка на равенство данных (проверка определенного ключа объекта), — это когда вы имеете дело с удаленными объектами данных или записями базы данных, которые можно идентифицировать по определенному ключу. В коллекциях нет универсальной реализации, потому что это тривиально реализовать. - person Triynko; 14.05.2014
comment
Я только что создал набор вспомогательных методов в классе DataUtils с сигнатурой метода вроде indexOfValue( collection:*, value:*, match_field_or_function:* ):int;. Метод может просто перебирать коллекцию и либо извлекать определенное поле из каждого объекта для сравнения с value, либо запускать каждый объект через функцию, результат которой сравнивается с value. Параметр match_field_or_function даже обрабатывает имена полей, состоящие из нескольких частей, для детализации, например data.id, в наборе элементов списка, каждый из которых имеет свойство данных, содержащее объект любого типа с полем идентификатора. - person Triynko; 14.05.2014

Да, это можно сделать (но будьте осторожны, это хакерство): http://filimanjaro.com/2012/operators-overloading-in-as3-javascript-too-%E2%80%93-workaround/

В туториале я писал о перегрузке операторов +=, -=. Но можно и с ==, могу подробнее написать, если не понятно.

Ах, у подхода есть недостаток (в редких случаях он может быть даже опасен). Подумайте дважды, прежде чем использовать его в производстве.

ИЗМЕНИТЬ:

После тестов кажется, что трюк с +=, -= не применяется к оператору == (что имеет смысл). Извините за вводящую в заблуждение информацию.

person average Joe    schedule 24.01.2012
comment
Это совершенно безумно. Это действительно хакерство, но это одна из самых крутых вещей, которые я видел в AS3. - person thedayturns; 24.06.2012