是否可以使用字符串作为AS3语句?

时间:2014-08-02 05:35:06

标签: string actionscript-3

例如我有一个字符串

    var string:String = new String("myFunc(para1, para2);");

有什么方法可以将这个字符串值用作AS3语句?

注意:参数的数量可能会有所不同,因为string的值将动态决定,所以如果你建议我使用字符串属性来分隔参数和函数名,然后像许多教程一样使用它: -

    this[string](para1, para2);

不会解决我的问题。

2 个答案:

答案 0 :(得分:1)

我相信你仍然可以通过打破你的字符串来解决你的问题。您可以使用' rest'来编写您的方法/函数以接收可变数量的参数。参数或参数对象。这里提到的两个例子都有:http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f56.html

基于我的评论,一些示例代码:

// this just takes in a bunch of numbers and returns the sum
function myFunc(...args:Array):Number {
    var result:Number = 0;
    for(var counter:int = 0; counter < args.length; counter++){
        result += args[counter];
    }
    return result;
}

// can manually call it and pass in as many parameters as you want
myFunc(1,2,3); // will return 6
myFunc(1,2,3,4,5); // will return 15
myFunc(1,2,3,4,5,6,7,8,9,10); // will return 55


// and based on your comment:
var functionName:String = "myFunc";
var parameters:Array = new Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
// since you've mentioned your parameters in an array already, can just use the apply() call as Pan suggested
this[functionName].apply(this, parameters); // will return 210

答案 1 :(得分:0)

如果您指的是通过解释字符串中的代码来动态评估和执行表达式,则ActionScript 3不像某些语言那样支持eval()

有一些字节码生成器,如ActionScript 3 Eval Libraryas3scriptinglib,可以实现类似的代码实时解释。

如上所述,您可以使用函数rest parameter

public function myFunc(... args) {
    for each (var arg:String in args) {
        trace(arg);
    }
}

被称为:

myFunc("para1");
myFunc("para1", "para2");

或者,使用Function对象使用apply()传递参数数组,称为:

var f:Function = myFunc;
f.apply(this, ["para1", "para2"]);

或者,使用call()传递参数,称为:

var f:Function = myFunc;
f.call(this, "para1", "para2");

另一种方法是创建要解析的域特定语言;或者,只需将字符串值解析为ActionScript,例如:

package {

    public class DSL {

        public static function parse(thisArg:*, statement:String) {
            // get the function name
            var fn:String = statement.substr(0, statement.indexOf('('));

            // get parameters (between parenthesis)
            var params:Array = statement.substring(statement.indexOf('(') + 1, statement.lastIndexOf(')')).split(',');
            params.forEach(function(element:*, index:int, arr:Array):void {
                arr[index] = this[element.replace(/^\s+|\s+$/g, '')];
            }, thisArg);

            // execute
            var f:Function = thisArg[fn];
            f.apply(thisArg, params);
        }
    }
}

作为演示,请调用DSL.parse()并传递引用函数的字符串和属性:

package {

    public class Demo {

        public var para1:String = "hello";
        public var para2:String = "world";

        public function myFunc(... args) {
            for each (var arg:String in args) {
                trace(arg);
            }
        }

        public function Demo() {
            DSL.parse(this, "myFunc(para1);");
            DSL.parse(this, "myFunc(para1, para2);");
        }
    }
}

这将输出:

hello

hello
world