2009-09-10 10 views
9

Me pregunto si hay alguna manera de descomprimir una lista de argumentos de longitud variable en AS3. Tomemos por ejemplo esta función:Desenrollando var args en AS3

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

Si llamo a esto:

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

resultado ahora contiene un conjunto anidado de matrices:

[[[[]]]] 

El problema aquí es que el parámetro args es tratado como una matriz. Entonces, si lo paso a una función con una lista de argumentos variables, se tratará como un único argumento.

En Scala no es el: _ * operador que le dice al compilador para romper una lista en una lista de parámetros:

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

me gustaría saber si existe una técnica/operador en AS3 para ampliar una matriz en una lista de argumentos.

Respuesta

12

El método apply() en todas las funciones le permite pasar los argumentos en una matriz en lugar de la forma "normal".

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

Gracias por la respuesta, pero esto no es lo que estoy buscando para. He reescrito la pregunta en un intento de explicarme más claramente. –

+0

hokay, editado mi respuesta. ¿mejor ahora? ;) – grapefrukt

+0

Gracias pomelo –

3

Como nota al margen de esta respuesta

La pregunta original no sólo pasaba la "desenrollada" ... args utilizando el super, pero también para pasar un habitual variable de primera

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

Si este fuera el método real que se llama el código sería

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

Gracias, vinieron aquí buscando exactamente esto –

Cuestiones relacionadas