Haxe,在运行时区分匿名函数

时间:2011-03-08 06:12:11

标签: actionscript-3 function function-pointers anonymous-function haxe

我正试图区分匿名函数,如:

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"。即使它们是相同的功能,它们也不是同一个对象。

有没有办法比较那些如果它们执行相同任务它们是相同的功能?

有没有办法序列化功能?因此,我可以比较序列化的表示,看看它们是否共享相同的“代码”。

1 个答案:

答案 0 :(得分:3)

一些澄清:

  • 您发布的前两个样本几乎完全相同。唯一的区别是您已将第二个分配给静态变量。您可以直接使用静态函数,主要区别是在这种情况下函数不可更改如果您想这样做,则应添加dynamic修饰符。

  • 从最新版本开始,您可以使用本地命名函数:

    static f() { function a() { trace("hi"); }; a() }
    
  • 要正确比较您应使用Reflect.compareMethods()的方法。有时,Haxe会在函数周围创建闭包,这可能会破坏平等。

  • 您可以比较函数引用,但不能比较函数 body 。所以答案是否定的,你不能比较在不同的陈述中产生的功能,但做同样的事情。

  • 您无法序列化功能。

  • 您可以找到一些特定于平台的方法来处理这种情况,或者Macro也可以应用(创建函数签名),但我认为重新设计代码更容易。另一个选择是对那些需要具有可比性和可序列化的调用采用像hscript这样的库。