2010-01-17 21 views
2

我真的希望能夠在數組的邊界上使Flash的數組訪問語法'wrap'。擴展AS3的數組訪問操作符以'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' 

...那很好,但我的真正想要做的就是擴展Array對象本身,以便它自動'包裝'超出界限的索引值。

TL; DR - 是否可以通過擴展Flash AS3的Array對象進行索引封裝?

回答

8

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

我自己沒有使用它,但它似乎可以完成這項工作。我修改了文檔中的示例代碼,它以您想要的方式工作。儘管如此,我還沒有徹底測試過,你可能想要這樣做。就個人而言,我不會擴展數組,只是用2種添加/檢索方法創建一個簡單的類,因爲代理想法似乎有點牽扯到我。但那是我。

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

+1。就我而言,絕對是正確的答案。 +1是用於使用flash_proxy的動態類。 – sberry 2010-01-17 18:31:36

+0

呵 - 迷人!我將不得不與這一點混在一起 - 也許你是對的,可能會更容易,只是製作一種封裝類,將陣列頂部的'wrap'功能層疊起來,但是... ...我會試試看! – 2010-01-17 21:34:34

+0

很酷,是的,把這個插入到了我正在搞的項目中,正是我想要的東西。我可以看到我將不得不花費一些時間玩代理類,我沒有任何機會在之前看它......謝謝! – 2010-01-21 23:51:40

0

不是。您不能覆蓋[]運算符。但是,您可以擴展數組並添加一個將應用代碼片段的函數。這就是說我不確定你爲什麼要這個功能。一個循環鏈表將是一個更合適的數據結構。

+0

鏈表聽起來不像是最好的選擇,如果你想隨機訪問。 – 2010-01-17 15:54:27

+0

我只是想,而不是總是調整索引值_before_將其饋送到數組中,讓數組簡單地能夠以該格式_accept_索引可能會很有趣。 – 2010-01-17 21:39:10

+0

@Juan - 從馬特的描述來看,它聽起來像一個旋轉木馬照片庫:) – Allan 2010-01-17 23:01:36