2009-09-10 3 views
9

AS3で可変長引数リストをアンパックする方法があるのだろうかと思います。たとえば、この機能を取る:AS3でのvar argsのアンロール

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

私はこれを呼び出す場合:

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

結果が今の配列のネストされたセットが含まれます

[[[[]]]] 

をここでの問題は、引数のパラメータがあるということです配列として扱われます。ですから、可変引数リストを持つ関数に渡すと、それは単一の引数として扱われます。 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に存在するかどうかを知りたいです引数リストへの配列

答えて

12

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

    } 

} 
+0

となりますが、これは私が探しているものではありません ために。私は自分自身をより明確に説明しようと試みて、その質問を書き直しました。 –

+0

ホーケイ、私の答えを編集しました。今はまし? ;) – grapefrukt

+0

グレープフルーツありがとう –

3

元の質問は、スーパーを使用して「広げられた」...引数を渡しただけでなく、

public function varArgsFunc(amount:int, ...args):Array 
定期的な変数最初に合格する

この回答へのサイドノートとして、

これが実際のメソッドであれば、コードは

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

ありがとう、ちょうどこれを探してここに来た –

関連する問題