2015-02-07 29 views
5
  1. W języku ActionScript można przekazać listę dowolnych argumentów do funkcji:haXe: Przekazywanie lista arbitralnych argumentów funkcji

    funkcja foo (... args): void {trace (args.length); }

Czy jest jakaś umiejętność w Haxe do zrobienia czegoś takiego? Chciałbym wywołać funkcję z argumentami nieznanego typu i liczyć.

  1. ActionScript umożliwia funkcjami przekazywanie tablicy arbitralnych argumentów połączyć:

    foo.apply (to argsArray);

Czy to możliwe w Haxe?

Odpowiedz

6

z dokumentacji Haxe, można użyć argumentu Odpoczynek.

„jeśli końcowy argument makro jest typu tablicy, makro przyjmuje dowolną liczbę dodatkowych argumentów, które są dostępne w tej tablicy

import haxe.macro.Expr; 

class Main { 
    static public function main() { 
     myMacro("foo", a, b, c); 
    } 

macro static function 
    myMacro(e1:Expr, extra:Array<Expr>) { 
    for (e in extra) { 
     trace(e); 
    } 
    return macro null; 
    } 
} 

Z http://haxe.org/manual/macro-rest-argument.html

+0

To jest poprawna odpowiedź, jeśli chcesz napisać własną metodę, która przyjmuje dowolną liczbę argumentów. Nie każdy cel kompilatora Haxe obsługuje argumenty "Rest", ale można je emulować podczas kompilacji za pomocą makr. –

4

Możesz nazwać Reflect.callMethod - http://api.haxe.org/Reflect.html#callMethod

Przykład użycia:

class Test { 
    static function main() { 
     var console = js.Browser.window.console; 
     var fn = console.log; 
     Reflect.callMethod(console,fn,[1,2,"three",[4]]); 
    } 
} 
+0

To jest poprawna odpowiedź, jeśli wywołujesz istniejącą metodę (w środowisku macierzystym lub zewnętrznym), która może przyjąć dowolną liczbę argumentów. –

+0

Dzięki za wspaniałą odpowiedź. :RE – zehelvion

3

Wystarczy dodać do tego, jeśli opisujący extern dla zewnętrznej biblioteki JavaScript (lub Python, Lua, lub jakikolwiek język docelowy, który obsługuje parametr odpoczynek, np ...rest), istnieje specyficzny typ Haxe, haxe.extern.Rest, aby wyrazić to.

Oto przykład pokazujący, że funkcja JavaScript Math.max obsługuje varargs: http://try.haxe.org/#4607C

class Test { 
    static function main() { 
    trace("JS Math.max takes varargs:"); 
    trace(MyMath.max(1,2,3,4)); // 4 
    trace(MyMath.max(5,6));  // 6 
    } 
} 

@:native("Math") 
extern class MyMath { 
    static function max(a:Float, 
         b:Float, 
         rest:haxe.extern.Rest<Float>):Float; 
} 

Zauważ, że biblioteka standardowa Haxe robi nie określić Math.max z rekreacyjne, a jego celem jest kompatybilność cross-platform.