Haxe - SWC中可变数量的参数

时间:2017-10-04 12:38:26

标签: actionscript-3 arguments haxe

我正在将一个库从AS3移植到Haxe,我需要创建一个接受可变数量参数的方法。 Target是一个* .swc库。

我的问题与this one有关,但没有一个建议的解决方案输出带有所需签名的方法:someMethod(...params)

相反,生成的方法是:someMethod(params:*=null)

这不会在使用库的AS3项目中编译,并且使用的代码超出了我的范围。有没有办法做到这一点,也许是宏?

1 个答案:

答案 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(", ");
}