расширение операторов доступа к массиву AS3 для «обертывания» значений индекса за пределами границ - PullRequest
2 голосов
/ 17 января 2010

Мне бы очень хотелось, чтобы синтаксис доступа к массиву Flash был «обернут» за границы массива.

Длительное объяснение -

var array:Array = ['a','b','c','d','e','f'];

Для простоты первый индекс равен 0, а его значением является первая буква 'a'. Чтобы получить это значение, мы сделаем это -

array[0]; // returns 'a'

Пока индекс, который вы используете для доступа к массиву, находится между 0 и array.length (в нашем примере 6), все работает нормально - но если вы используете индекс вне этих границ, вы закрываетесь .

array[-3];
array[9]; // both return 'undefined'

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

array[-3];
array[9]; // both return 'd'

(например, фотогалерея, которая возвращается к началу при нажатии кнопки «Далее» на последней фотографии)

Есть небольшой кусок кода, который я использую снова и снова для такого рода вещей, но всегда нужно изменить индекс до того, как передаст его в массив:

var index = -3;
while(index < 0){index += array.length}
array[index % array.length]; // returns 'd'

... и это нормально, но я действительно хочу расширить сам объект Array, чтобы он автоматически «оборачивал» значения индекса, выходящие за пределы.

TL; DR - возможно ли перенос индекса при расширении объекта Array Flash AS3?

Ответы [ 2 ]

8 голосов
/ 17 января 2010

Проверьте прокси-класс: http://livedocs.adobe.com/flex/2/langref/flash/utils/Proxy.html.

Я сам этим не пользовался, но, похоже, он справился. Я изменил пример кода в документации, и он работает так, как вы хотите. Я не проверил это полностью, и вы можете сделать это. Лично я не стал бы расширять Array и просто создал бы простой класс с двумя методами для добавления / извлечения, поскольку идея прокси-сервера мне кажется немного сложной. Но это я.

package
{
    import flash.utils.Proxy;
    import flash.utils.flash_proxy;

    dynamic class ProxyArray extends Proxy {
        private var _item:Array;

        public function ProxyArray() {
            _item = new Array();
        }

        override flash_proxy function callProperty(methodName:*, ... args):* {
            var res:*;
            res = _item[methodName].apply(_item, args);
            return res;
        }

        override flash_proxy function getProperty(name:*):* {
            if(!isNaN(name)) {
                var index:int = name;
                while(index < 0) {
                    index += this.length;

                }
                return _item[index % this.length];
            }


            return _item[name];
        }

        override flash_proxy function setProperty(name:*, value:*):void {
            _item[name] = value;
        }
    }
}

Использование:

        var a:ProxyArray = new ProxyArray();
        // you can't use this syntax ['a','b','c'], since it would return an Array object
        a.push("a");
        a.push("b");
        a.push("c");
        a.push("d");
        a.push("e");
        a.push("f");

        trace(a[-3]);
        trace(a[9]); 
0 голосов
/ 17 января 2010

Не совсем. Вы не можете переопределить оператор []. Однако вы можете расширить массив и добавить функцию, которая будет применять фрагмент кода. При этом я не уверен, почему вы действительно хотите эту функциональность. Круговой связанный список будет более подходящей структурой данных.

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