0

我正在尝试区分匿名函数,例如:

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

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

有没有办法序列化函数?这样也许我可以比较序列化的表示,看看它们是否共享相同的“代码”。

4

1 回答 1

4

一些澄清:

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

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

    静态 f() { function a() { trace("hi"); }; 一个() }
    
  • 要正确比较方法,您应该使用Reflect.compareMethods(). 有时 Haxe 会围绕函数创建闭包,这会破坏相等性。

  • 您可以比较函数引用,但不能比较函数。所以答案是否定的,你不能比较在不同语句中生成但做同样事情的函数。

  • 您不能序列化函数。

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

于 2011-03-08T10:11:04.403 回答