我正在将一个库从AS3移植到Haxe,我需要创建一个接受可变数量参数的方法。 Target是一个* .swc库。
我的问题与this one有关,但没有一个建议的解决方案输出带有所需签名的方法:someMethod(...params)
相反,生成的方法是:someMethod(params:*=null)
这不会在使用库的AS3项目中编译,并且使用的代码超出了我的范围。有没有办法做到这一点,也许是宏?
答案 0 :(得分:3)
嗯,这是一个很好的问题。并且,事实证明有一种方法可以做到这一点!
基本上,__arguments__
是Flash目标上的特殊标识符,主要用于访问特殊的局部变量arguments
。但它也可以在方法签名中使用,在这种情况下,它会将输出从test(args: *)
更改为test(...__arguments__)
。
一个简单示例(live on Try Haxe):
class Test {
static function test(__arguments__:Array<Int>)
{
return 'arguments were: ${__arguments__.join(", ")}';
}
static function main():Void
{
// the haxe typed way
trace(test([1]));
trace(test([1,2]));
trace(test([1,2,3]));
// using varargs within haxe code as well
// actually, just `var testm:Dynamic = test` would have worked, but let's not add more hacks here
var testm = Reflect.makeVarArgs(cast test); // cast needed because Array<Int> != Array<Dynamic>
trace(testm([1]));
trace(testm([1,2]));
trace(testm([1,2,3]));
}
}
最重要的是,这会产生以下结果:
static protected function test(...__arguments__) : String {
return "arguments were: " + __arguments__.join(", ");
}