2009-09-10 11 views
9

Zastanawiam się, czy jest jakiś sposób na rozpakowanie listy argumentów o zmiennej długości w AS3. Weźmy na przykład tę funkcję:Unrolling var args w AS3

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

Gdybym nazywają to:

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

wynik zawiera teraz zagnieżdżony zestaw tablic:

[[[[]]]] 

Tutaj problemem jest to, że parametr args jest traktowany jak tablica. Więc jeśli przekażę go do funkcji ze zmienną listą argumentów, będzie traktowany jako pojedynczy argument.

W Scala znajduje się: operator _ *, który mówi, że kompilator rozpadają listę do listy parametrów:

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]) 

chciałbym wiedzieć, czy to technika/operator występuje w AS3, aby rozwinąć tablica do listy argumentów.

Odpowiedz

12

Metoda na wszystkich funkcjach pozwala przekazywać argumenty w tablicy zamiast "normalnej".

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

Dziękuję za odpowiedź, ale to nie jest to, czego szukam dla. Przerobiłem to pytanie, próbując wyjaśnić siebie dokładniej. –

+0

hokay, zredagowałem moją odpowiedź. Lepiej teraz? ;) – grapefrukt

+0

Dzięki grejpfrutowi –

3

Na marginesie tej odpowiedzi

Oryginalny pytanie było nie tylko przepuszczanie „rozwinięty” ... args Korzystanie z pełnego ale także przekazać regularne zmienna pierwszy

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

Jeśli była to aktualna metoda, kod brzmiałby:

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

Dzięki, przyszedłeś tutaj, szukając dokładnie tego –