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.

Foi útil?

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

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));
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top