10

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 に存在するかどうかを知りたいです。

4

2 に答える 2

13

すべての関数の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);
        }

    }

}
于 2009-09-10T13:29:04.847 に答える
3

この回答の補足として

元の質問は、スーパーを使用して「展開された」...引数を渡すだけでなく、通常の変数を最初に渡すことでした

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

これが呼び出される実際のメソッドである場合、コードは次のようになります。

public function varArgsFunc(amount:int, ...args):Array
{  
  super.varArgsFunc.apply(this, [amount].concat(args));
}
于 2013-02-27T15:37:06.747 に答える