在 Haxe 中 "physically equal" 是什么意思?
What is meant by being "physically equal" in 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
是我在 Main 文件中声明的函数,但跟踪永远不会输出。
我浏览了 compareMethods
函数的代码提示,无意中发现了以下术语:if 'f1' and the 'f2' are **physically** equal
.
现在,它们都是函数,在 Haxe 手册中没有任何地方提到物理函数。所以我有一个两部分的问题,真的。
什么是物理函数,如何实现如上预期的跟踪结果?提前谢谢你。
根据 haxe 单元测试(和 Reflect 的 js 源代码)Reflect.compareMethods
returns 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() {}
}
我一直在玩弄 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
是我在 Main 文件中声明的函数,但跟踪永远不会输出。
我浏览了 compareMethods
函数的代码提示,无意中发现了以下术语:if 'f1' and the 'f2' are **physically** equal
.
现在,它们都是函数,在 Haxe 手册中没有任何地方提到物理函数。所以我有一个两部分的问题,真的。
什么是物理函数,如何实现如上预期的跟踪结果?提前谢谢你。
根据 haxe 单元测试(和 Reflect 的 js 源代码)Reflect.compareMethods
returns 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() {}
}