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