Desenrolamento de args var em AS3
-
05-07-2019 - |
Pergunta
Eu estou querendo saber se há alguma maneira de descompactar uma lista de argumentos de comprimento variável em AS3. Tomemos por exemplo esta função:
public function varArgsFunc(amount:int, ...args):Array
{
if (amount == 3)
{
return args
}
else
{
return varArgsFunc(++amount, args)
}
}
Se Eu chamo isso:
var result:Array = varArgsFunc(0, [])
resultar agora contém um conjunto aninhado de matrizes:
[[[[]]]]
O problema aqui é que o parâmetro args é tratado como uma matriz. Então, se eu passá-lo para uma função com uma lista de argumentos variável, ele será tratado como um único argumento.
Em Scala, há o: _ * operador que informa o compilador para quebrar uma lista em uma 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])
Gostaria de saber se uma técnica / operador existe no AS3 para expandir uma matriz em uma lista de argumentos.
Solução
O aplicar () método em todas as funções permite que você passe nos argumentos em uma matriz em vez do caminho "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);
}
}
}
Outras dicas
Como uma nota de lado para esta resposta ??p>
A pergunta original não foi apenas passando o "desenrolado" ... args usando o super, mas também para passar uma variável regular de primeira
public function varArgsFunc(amount:int, ...args):Array
Se este foi o método real que está sendo chamado de código seria
public function varArgsFunc(amount:int, ...args):Array
{
super.varArgsFunc.apply(this, [amount].concat(args));
}