【问题标题】:Flash AS3 ... (rest) parameterFlash AS3 ... (rest) 参数
【发布时间】:2011-07-09 18:14:35
【问题描述】:

好的,所以我们都知道在函数中使用 ...(rest)参数可以让我们传递任意数量的参数,就像 Adob​​e AS3 手册中的示例一样:

function traceArgArray(x: int, ... args) {

for (var i:uint = 0; i < args.length; i++) {

trace(args[i]);

}

} 

traceArgArray(1, 2, 3);

但是,我希望能够做的是选择传递单个参数或从现有数组传递参数:

myArray:Array = new Array(1,2,3);

等等:

traceArgArray(myArray);

正如我在此处所写的,该函数将 myArray 视为单个对象,因此输出为 1,2,3 - 表示整个数组,而不是数组的各个内容。

为了将 myArray 转换为一个逗号分隔的列表,其余操作员会将其识别为单个元素的列表,我尝试了这个:

traceArgArray(myArray.join());

但这并没有改变输出。在这种情况下,参数似乎被解释为单个字符串而不是逗号分隔的列表。

所以,我希望有人可以帮助我解决的难题可以通过以下两种方式之一表达:

是否有可能获取其余参数以将数组参数视为以逗号分隔的参数列表?

-或-

有没有一种方法可以将数组转换为逗号分隔的列表,然后将该列表作为逗号分隔的列表(而不是长字符串)传递给函数,以便其余运算符可以正确解释它?

我想做的基本事情——能够将值数组传递给接受任意数量参数的函数——似乎是通用的,所以也许有一个我没有看到的解决方法因为我对 rest 运算符本身很着迷。

感谢阅读!

【问题讨论】:

标签: actionscript-3


【解决方案1】:

您正在寻找的是Function.apply()。在您的情况下,它看起来像这样:

myArray:Array = new Array(1,2,3);

function traceArgArray(x: int, ... args) {
    for (var i:uint = 0; i < args.length; i++) {
        trace(args[i]);
    }
} 

traceArgArray.apply(this, [0].concat(myArray)); // [0] being the first argument (x)

【讨论】:

    【解决方案2】:

    看到这个

    AS3 ... (rest) parameter

    上面引用了这个:

    AS3 arguments

    这也很有用

    filling in (...rest) parameters with an array?

    【讨论】:

    • +1 用于使用搜索并参考以前提出的问题
    【解决方案3】:

    我认为在这种情况下,更多的是处理 args 然后尝试调用不同的方法...

        traceArgArray(1, 2, 3);
    
        var myArray:Array = new Array(1,2,3);   
        traceArgArray(1,myArray,"hello");
    
    
        myArray.push(["a",23,"her", 1.456, ["--","||",12,11] ]);
        traceArgArray(1,myArray,"hello");
    
        private var theArgsILike:Array= new Array();
    
        private function traceArgArray(x: int, ... args):void {
    
        //Creates the args you expect...
            theArgsILike.push(x);
            addArgs(args);
    
        // Trace both old and new style args
            trace("NEW Call: ------");
            trace("\n \targs: ------");
            for (var i:uint = 0; i < args.length; i++) {    
                trace(args[i]);
            }
            trace("\n \t The Args I Like: ------");
            for ( i = 0; i < theArgsILike.length; i++) {
                trace(theArgsILike[i]);
            }
            trace("\n");
    
            theArgsILike = new Array();
        }
    
        //splitting each array in its parts to add them on theArgsILike
        private function addArgs(inArgs:Array):void{
                //check if it is array 
            for each(var arg in inArgs){
                        if( Class(getDefinitionByName(getQualifiedClassName(arg))) == Class(getDefinitionByName(getQualifiedClassName(inArgs)))  ){
                        //spilt iteratively
                            addArgs(arg);
                        }
                        else{
                        // add arg 
                            theArgsILike.push(arg);
                        }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 2012-09-08
      • 2017-05-17
      • 1970-01-01
      • 2010-12-05
      • 2015-08-22
      • 1970-01-01
      相关资源
      最近更新 更多