Развертывание var args в AS3 - PullRequest
9 голосов
/ 10 сентября 2009

Мне интересно, есть ли какой-нибудь способ распаковать список аргументов переменной длины в AS3. Возьмем для примера эту функцию:

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

Если я позвоню так:

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

Результат теперь содержит вложенный набор массивов:

[[[[]]]]

Проблема здесь в том, что параметр args обрабатывается как массив. Поэтому, если я передам его в функцию со списком аргументов переменной, он будет рассматриваться как один аргумент.

В Scala есть оператор: _ *, который указывает компилятору разбивать список на список параметров:

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

Я хотел бы знать, существует ли в AS3 метод / оператор для расширения массива в список аргументов.

Ответы [ 2 ]

12 голосов
/ 10 сентября 2009

Метод apply () для всех функций позволяет передавать аргументы в массиве вместо «обычного» способа.

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

    }

}
3 голосов
/ 27 февраля 2013

Как примечание к этому ответу

Первоначальный вопрос заключался не только в том, чтобы передать "развернутые" ... аргументы с помощью super, но также вначале передать обычную переменную

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

Если бы это был фактический вызываемый метод, код был бы

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