2017-10-04 11 views
2

Je porte une bibliothèque de AS3 à Haxe et je dois faire une méthode acceptant le nombre variable d'arguments. La cible est une bibliothèque * .swc.Haxe - nombre variable d'arguments dans SWC

Ma question porte sur this one mais aucune des solutions proposées en sortie une méthode avec la signature requise: someMethod(...params)

Au lieu de cela, la méthode produit est: someMethod(params:*=null)

Ce ne sera pas compilé dans des projets AS3 utilisant le bibliothèque et le code utilisé est hors de ma portée. Y a-t-il un moyen de faire cela, peut-être des macros?

Répondre

3

Eh bien, c'est une excellente question. Et, il s'avère qu'il y a un moyen de le faire!

Fondamentalement, __arguments__ est un identifiant spécial sur la cible Flash, principalement utilisé pour accéder à la variable locale spéciale arguments. Mais il peut également être utilisé dans la signature de la méthode, auquel cas il change la sortie de test(args: *) à test(...__arguments__).

Un exemple rapide (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])); 
    } 
} 

Plus important encore, ce génère:

static protected function test(...__arguments__) : String { 
    return "arguments were: " + __arguments__.join(", "); 
}