例如我有一个字符串
var string:String = new String("myFunc(para1, para2);");
有什么方法可以将这个字符串值用作AS3语句?
注意:参数的数量可能会有所不同,因为string的值将动态决定,所以如果你建议我使用字符串属性来分隔参数和函数名,然后像许多教程一样使用它: -
this[string](para1, para2);
不会解决我的问题。
答案 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 Library和as3scriptinglib,可以实现类似的代码实时解释。
如上所述,您可以使用函数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