2009-09-10 12 views
9

Mi chiedo se ci sia un modo per decomprimere un elenco di argomenti di lunghezza variabile in AS3. Prendiamo ad esempio questa funzione:Srotolamento di argomenti in AS3

public function varArgsFunc(amount:int, ...args):Array 
{ 
    if (amount == 3) 
    { 
     return args 
    } 
    else 
    { 
     return varArgsFunc(++amount, args) 
    } 
} 

Se io chiamo questo:

var result:Array = varArgsFunc(0, []) 

risultato ora contiene una serie nidificato di array:

[[[[]]]] 

il problema qui è che il parametro args è trattato come una matrice. Quindi se lo passo su una funzione con una lista di argomenti variabili, sarà trattato come un singolo argomento.

In Scala c'è il: _ * operatore che dice al compilatore di spezzare un elenco in un elenco di parametri:

var list:Array = ['A', 'B', 'C'] 

// now imagine we have this class, but I would like to pass each list element 
// in as a separate argument 
class Tuple { 
    public function Tuple(...elements) 
    { 
     // code 
    } 
} 

// if you do this, the list will become be passed as the first argument 
new Tuple(list) 

// in scala you can use the :_* operator to expand the list 
new Tuple(list :_*) 

// so the :_* operator essentially does this 
new Tuple(list[0], list[1], list[2]) 

Vorrei sapere se una tecnica/operatore esiste in AS3 per espandere una matrice in una lista di argomenti.

risposta

12

Il metodo apply() su tutte le funzioni consente di passare gli argomenti in una matrice anziché in modalità "normale".

package { 
    import flash.display.Sprite; 

    public class Foo extends Sprite { 

     public function Foo() { 

      var args:Array = ["a", "b", "c"]; 

      // "normal" call 
      varArgsFunc(args); 

      // what you wanted: 
      varArgsFunc.apply(null, args); 
     } 

     public function varArgsFunc(...args):Array { 
      trace("got", args); 
     } 

    } 

} 
+0

Grazie per la risposta, ma questo non è quello che sto cercando per. Ho riscritto la domanda nel tentativo di spiegarmi meglio. –

+0

hokay, ha modificato la mia risposta. meglio ora? ;) – grapefrukt

+0

Grazie pompelmo –

3

Come nota a margine a questa risposta

La domanda iniziale non è stato solo di passaggio la "srotolato" ... args utilizzando il super, ma di passare anche un normale variabile prima

public function varArgsFunc(amount:int, ...args):Array 

Se questo fosse il metodo effettivo chiamato il codice sarebbe

public function varArgsFunc(amount:int, ...args):Array 
{ 
    super.varArgsFunc.apply(this, [amount].concat(args)); 
} 
+0

Grazie, sono venuto qui cercando esattamente questo –