actionscript-3 variadic-functions

actionscript 3 - Desenrollando var args en AS3



actionscript-3 variadic-functions (2)

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

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

Si llamo esto:

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

resultado ahora contiene un conjunto anidado de matrices:

[[[[]]]]

El problema aquí es que el parámetro args se trata 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 está el operador: _ * que le dice al compilador que separe 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 expandir una matriz en una lista de argumentos.


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); } } }


Como nota al margen de esta respuesta

La pregunta original no era solo pasar el "desenrollado" ... args usando el súper pero también pasar una variable regular primero

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)); }