2016-03-19 14 views
7

Tôi đã chơi đùa với Neko Modules, nhưng tôi nghĩ rằng tôi nhận được một số hành vi không nhất quán.Điều gì có nghĩa là bằng cách "bằng thể chất" trong Haxe?

var funcs = 0; 
var objs = 0; 
for (i in 0...m.globalsCount()) 
{ 
    var obj:Dynamic = m.getGlobal(i); 

    if (Reflect.compareMethods(obj, init)) 
     trace("matched"); 

    if (Reflect.isFunction(obj)) 
     funcs++; 
    else if (Reflect.isObject(obj)) 
     objs++; 
} 
trace('Functions: $funcs'); 
trace('Objects: $objs'); 

Trong mã trên, lần đầu tiên, tôi nhận được tổng cộng 4487 chức năng. Nếu tôi xóa một chức năng, xây dựng lại và chạy, tôi nhận được dự kiến ​​4486.

tôi thêm sự so sánh compareMethods để so sánh obj với init, nơi init là một chức năng tôi khai báo trong tập tin chính, nhưng các dấu vết là không bao giờ đầu ra .

Tôi liếc qua mã gợi ý cho hàm compareMethods và tôi tình cờ gặp thuật ngữ sau: if 'f1' and the 'f2' are **physically** equal.

Bây giờ, chúng là cả hai chức năng và không có nơi nào trong sách hướng dẫn Haxe đề cập đến bất kỳ điều gì về chức năng vật lý. Vì vậy, tôi có một câu hỏi hai phần, thực sự.

Chức năng vật lý là gì và làm cách nào để đạt được kết quả theo dõi như bạn mong đợi ở trên? Cảm ơn bạn, trước.

+0

dunno câu trả lời cho điều này, nhưng tôi làm muốn biết những gì mục tiêu của bạn là trong đoạn mã của bạn được đăng trên. Quan tâm chia sẻ? – bguiz

+0

Tôi đã hy vọng sử dụng phương thức gọi hàm từ mô-đun Neko bên ngoài để cho phép sửa đổi các ứng dụng hiện có mà không biên dịch lại, vô hiệu hóa hiệu quả nhu cầu các tệp tin ndll/dll mà tôi tin là đúng đối với mục tiêu gốc. – tienery

Trả lời

2

Theo kiểm tra đơn vị haxe (và nguồn js của Reflect) Reflect.compareMethods trả về true chỉ khi bạn so sánh bất kỳ phương pháp nào của cùng một đối tượng với chính nó.

// https://github.com/HaxeFoundation/haxe/blob/ff3d7fe6911ab84c370b1334d537a768a55cca56/tests/unit/src/unit/TestReflect.hx 
// 
// t(expr) - expr should be true 
// f(expr) - expr should be false 

function testCompareMethods() { 
    var a = new MyClass(0); 
    var b = new MyClass(1); 
    t(Reflect.compareMethods(a.add,a.add)); 
    f(Reflect.compareMethods(a.add,b.add)); 
    f(Reflect.compareMethods(a.add,a.get)); 
    f(Reflect.compareMethods(a.add,null)); 
    f(Reflect.compareMethods(null, a.add)); 
    /* 
     Comparison between a method and a closure : 
     Not widely supported atm to justify officiel support 
     var fadd : Dynamic = Reflect.field(a, "add"); 
     var fget : Dynamic = Reflect.field(a, "get"); 
     t(Reflect.compareMethods(fadd, fadd)); 
     t(Reflect.compareMethods(a.add, fadd)); 
     t(Reflect.compareMethods(fadd, a.add)); 
     f(Reflect.compareMethods(fadd, fget)); 
     f(Reflect.compareMethods(fadd, a.get)); 
     f(Reflect.compareMethods(fadd, null)); 
    */ 
} 

Ngoài ra, trường hợp sử dụng có thể

class Test { 
    static function main() { 
     var a = new A(); 
     var i:I = a; 
     trace(Reflect.compareMethods(a.test, i.test)); //returns true 
    } 
} 

interface I 
{ 
    function test():Void; 
} 

class A implements I 
{ 
    public function new() {} 
    public function test() {} 
} 
+0

CẬP NHẬT: tôi đã sai về phương pháp không tĩnh, nên làm việc cho bất kỳ chức năng nào. –

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