2017-10-04 9 views
2

私はAS3からHaxeにライブラリを移植しており、可変数の引数を受け入れるメソッドを作る必要があります。ターゲットは* .swcライブラリです。Haxe - SWCの可変引数数

私の質問はthis oneに関するしかし提案の解決策のいずれも必要署名とメソッドを出力しない:someMethod(...params)

はその代わりに、生成方法であってsomeMethod(params:*=null)

これは使用AS3プロジェクトにコンパイルされませんライブラリと使用されたコードは私の手の届かないものです。これを行う方法はありますか、おそらくマクロですか?

答えて

3

これは大きな問題です。そして、それはそれを行う方法があることが判明!

基本的に、__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(", "); 
}