代码之家  ›  专栏  ›  技术社区  ›  naviator

Haxe-SWC中的可变参数数

  •  2
  • naviator  · 技术社区  · 7 年前

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

    this one 但没有一个建议的解决方案输出具有所需签名的方法: someMethod(...params)

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

    这不会在使用该库的AS3项目中编译,所使用的代码是我力所能及的。有没有办法做到这一点,也许是宏?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Jonas Malaco    7 年前

    嗯,这是一个很好的问题。事实证明,有一种方法可以做到这一点!

    大体上 __arguments__ 是闪存目标上的特殊标识符,主要用于访问特殊的局部变量 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(", ");
    }