我想知道是否有办法解压缩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中是否存在一个技术/运算符,以将数组扩展为参数列表。
答案 0 :(得分: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);
}
}
}
答案 1 :(得分:3)
作为对此答案的旁注
最初的问题不仅是通过“展开”...使用超级的args而且还首先传递常规变量
public function varArgsFunc(amount:int, ...args):Array
如果这是被调用的实际方法,则代码将是
public function varArgsFunc(amount:int, ...args):Array
{
super.varArgsFunc.apply(this, [amount].concat(args));
}