我正试图区分匿名函数,如:
function() { trace("WOO"); }
来自其他人('名字'?),如
var _FUNC:Dynamic = function() { trace("WOO"); }
我想这样做的原因是因为我无法比较两个匿名函数,因为它们是两个不同的函数。
为了帮助我更清楚,请考虑以下简单示例。
var _TEST:Dynamic = function(a:Dynamic):String {
var _TESTA:Dynamic = function() { trace("WOO"); };
var _TESTB:Dynamic = _FUNC;
return (a == _TESTA) + ", " + (a == _TESTB);
}
如果我运行_TEST(_FUNC);
,我会回来"false, true"
。即使它们是相同的功能,它们也不是同一个对象。
有没有办法比较那些如果它们执行相同任务它们是相同的功能?
有没有办法序列化功能?因此,我可以比较序列化的表示,看看它们是否共享相同的“代码”。
答案 0 :(得分:3)
一些澄清:
您发布的前两个样本几乎完全相同。唯一的区别是您已将第二个分配给静态变量。您可以直接使用静态函数,主要区别是在这种情况下函数不可更改如果您想这样做,则应添加dynamic
修饰符。
从最新版本开始,您可以使用本地命名函数:
static f() { function a() { trace("hi"); }; a() }
要正确比较您应使用Reflect.compareMethods()
的方法。有时,Haxe会在函数周围创建闭包,这可能会破坏平等。
您可以比较函数引用,但不能比较函数 body 。所以答案是否定的,你不能比较在不同的陈述中产生的功能,但做同样的事情。
您无法序列化功能。
您可以找到一些特定于平台的方法来处理这种情况,或者Macro也可以应用(创建函数签名),但我认为重新设计代码更容易。另一个选择是对那些需要具有可比性和可序列化的调用采用像hscript这样的库。