Что означает быть физически равным в Haxe?

Я играл с модулями 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 и наткнулся на следующую терминологию: if 'f1' and the 'f2' are **physically** equal.

Обе они являются функциями, и нигде в руководстве Haxe ничего не говорится о физических функциях. Итак, у меня есть вопрос из двух частей, на самом деле.

Что такое физическая функция и как добиться результата трассировки, который вы ожидаете выше? Заранее спасибо.


person tienery    schedule 19.03.2016    source источник
comment
Не знаю ответа на этот вопрос, но я хочу знать, какова ваша цель во фрагменте кода, который вы разместили выше. Заботиться, чтобы поделиться?   -  person bguiz    schedule 21.03.2016
comment
Я надеялся использовать метод вызова функций из внешнего модуля Neko, чтобы позволить модифицировать существующие приложения без перекомпиляции, фактически сводя на нет необходимость в файлах ndll/dll, которые, как я считаю, предназначены исключительно для нативных целей.   -  person tienery    schedule 22.03.2016


Ответы (1)


Согласно модульным тестам 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() {}
}
person Mihail Ignatiev    schedule 21.03.2016