2016-03-19 12 views
7

私はNekoモジュールで遊んでいましたが、私はいくつかの矛盾した動作をしていると思います。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'); 

上記のコードでは、初めて実行すると合計4487の機能が得られます。私は機能を削除した場合は、再構築して実行し、私が期待される4486.

私はobjinitは、私がメインファイルで宣言された関数があるinit、と比較するcompareMethods比較を追加取得しますが、トレースが出力になることはありません。

私はcompareMethods関数のコードヒントを見て、次のような用語を見つけました:if 'f1' and the 'f2' are **physically** equal

ここでは、それらは両方とも関数であり、Haxeマニュアルで物理的機能について何も言及していません。だから私は本当に2つの部分の質問があります。

物理的な機能とは何ですか?また、上記のようにトレース結果を達成するにはどうすればよいですか?前もって感謝します。

+0

はこの答えを知らないが、私はあなたの目的は、コードにあるものたいを知っていますかは、あなたの上で掲載スニペット。ケアを共有する? – bguiz

+0

私は外部Nekoモジュールから関数を呼び出す方法を使用して、再コンパイルせずに既存のアプリケーションを変更できるようにしたいと考えていました。ネイティブターゲット用のndll/dllファイルの必要性を無効にしました。 – tienery

答えて

2

haxeユニットテスト(およびReflectのソース)によると、Reflect.compareMethodsは、同じオブジェクトの任意のメソッドをそれ自身と比較している場合のみ、trueを返します。

// 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)); 
    */ 
} 

また、可能な用途の場合

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

UPDATED:メソッドが非静的であることが間違っていました。どの関数でも動作するはずです。 –

関連する問題