2015-02-07 45 views
5
  1. 在ActionScript我可以通過任意參數列表功能:haXe的:傳遞的任意函數參數列表

    函數foo(參數... args):無效{跟蹤(args.length); }

Haxe有什麼能力做出類似的東西嗎?我想用未知類型和數量的參數調用函數。

  • 在ActionScript我可以調用函數傳遞數組作爲任意參數:

    foo.apply(此,argsArray);

  • Haxe有可能嗎?

    回答

    6

    來自Haxe文檔,您可以使用Rest參數。

    「如果宏的最後一個參數是陣列類型,宏接受的額外的參數,其可從該陣列

    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; 
        } 
    } 
    

    的任意數量的」

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

    +0

    這是正確的答案,如果你想編寫自己的方法,需要任意數量的參數。並不是每個Haxe編譯器目標都支持「Rest」參數,但是您可以在編譯時使用宏來模擬它。 – 2015-02-07 23:04:52

    4

    你可以打電話Reflect.callMethod - http://api.haxe.org/Reflect.html#callMethod

    用法示例:

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

    如果您正在調用可以接受任意數量參數的現有方法(在本機環境或外部環境中),則這是正確答案。 – 2015-02-07 23:03:11

    +0

    感謝您的好評。 :d – zehelvion 2017-05-27 07:11:52

    3

    我想補充這一點,如果你描述一個外部對外部JavaScript庫(或Python,Lua中,或支持其餘參數任何目標語言,例如...rest),有一個特定的Haxe類型,haxe.extern.Rest,來表達這一點。

    這裏的顯示錶明,JavaScript Math.max函數處理可變參數的例子: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; 
    } 
    

    注意,HAXE標準庫確實定義Math.max與休息,因爲它的目標是跨平臺的兼容性。