什么是Haxe中的“物理相等”?

7

我一直在尝试使用Neko模块,但是我觉得我得到了一些不一致的结果。

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个函数。
我添加了“compareMethods”比较来比较“obj”和“init”,其中“init”是我在主文件中声明的一个函数,但跟踪信息从未输出。
我瞥了一眼“compareMethods”函数的代码提示,并偶然发现以下术语:“如果'f1'和'f2'在**物理上**相等”。
现在,它们都是函数,在Haxe手册中没有任何关于物理函数的提及。所以我有一个两部分的问题。
什么是物理函数,如何实现上述预期的跟踪结果?谢谢您提前的回答。

不知道这个问题的答案,但我想知道你在上面发布的代码片段中的目标是什么。能分享一下吗? - bguiz
我希望使用从外部Neko模块调用函数的方法,以便在不重新编译的情况下修改现有应用程序,有效地消除了我认为仅适用于本机目标的ndll/dll文件的需求。 - tienery
1个回答

3
根据Haxe单元测试(以及Reflect的js源代码),只有在将同一对象的任何方法与其自身进行比较时,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() {}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接