2015-02-07 17 views
5
  1. Trong ActionScript tôi có thể vượt qua một danh sách các đối số tùy ý đến chức năng:haXe: Đi qua danh sách các đối số chức năng tùy ý

    chức năng foo (... args): void {trace (args.length); }

Có khả năng nào trong Haxe thực hiện điều gì đó như thế không? Tôi muốn gọi hàm với các đối số của kiểu không xác định và đếm.

  1. Trong ActionScript tôi có thể gọi chức năng đi qua một mảng như các đối số tùy ý:

    foo.apply (this, argsArray);

Có thể sử dụng Haxe không?

Trả lời

6

từ tài liệu Haxe, bạn có thể sử dụng đối số Rest.

"nếu đối số cuối cùng của một vĩ mô là loại mảng, macro chấp nhận một số bất kỳ các đối số phụ trợ có sẵn từ mảng

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

"

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

+0

Đây là câu trả lời đúng nếu bạn muốn viết phương pháp của riêng bạn có số lượng đối số tùy ý. Không phải mọi mục tiêu trình biên dịch Haxe đều hỗ trợ các đối số "Rest", nhưng bạn có thể mô phỏng nó tại thời gian biên dịch bằng cách sử dụng các macro. –

4

Bạn có thể gọi cho Reflect.callMethod - http://api.haxe.org/Reflect.html#callMethod

Ví dụ sử dụng:

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

Đây là câu trả lời đúng nếu bạn đang gọi một phương thức hiện có (trong môi trường tự nhiên hoặc một extern) có thể lấy một số lượng đối số tùy ý. –

+0

Cảm ơn câu trả lời tuyệt vời. : D – zehelvion

3

Chỉ cần thêm vào đó, nếu bạn đang mô tả một extern cho một thư viện JavaScript bên ngoài (hoặc Python, Lua, hoặc bất kỳ ngôn ngữ mục tiêu hỗ trợ tham số còn lại, ví dụ ...rest), có loại Haxe cụ thể, haxe.extern.Rest, để thể hiện điều này.

Dưới đây là một ví dụ cho thấy rằng hàm JavaScript Math.max xử lý 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; 
} 

Lưu ý rằng các thư viện chuẩn haXe không không xác định Math.max với phần còn lại, là mục tiêu của nó là nền tảng tương thích.

Các vấn đề liên quan