代码之家  ›  专栏  ›  技术社区  ›  matt lohkamp

将as3的数组访问运算符扩展为“wrap”超出绑定的索引值

  •  2
  • matt lohkamp  · 技术社区  · 15 年前

    我真的希望能够让flash的数组访问语法“wrap”覆盖数组的边界。

    冗长的解释-

    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'
    

    …很好,但我真正想做的是扩展数组对象本身,这样它将自动“包装”超出界限的索引值。

    tl;dr-扩展flasas3的数组对象是否可以进行索引包装?

    2 回复  |  直到 15 年前
        1
  •  8
  •   Juan Pablo Califano    15 年前

    查看代理类: http://livedocs.adobe.com/flex/2/langref/flash/utils/Proxy.html .

    我自己还没用过,但它似乎能胜任这项工作。我修改了文档中的示例代码,它按照您想要的方式工作。不过,我还没有彻底测试过,你可能想做。就我个人而言,我不会扩展数组,而只是用两种方法创建一个简单的类来添加/检索,因为代理的想法对我来说有点牵扯。但那就是我。

    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]); 
    
        2
  •  0
  •   Allan    15 年前

    不是真的。不能重写[]运算符。但是,您可以扩展数组并添加将应用代码段的函数。也就是说,我不知道为什么你真的想要这个功能。循环链接列表将是更合适的数据结构。