【问题标题】:Haxe, differentiate anonymous function at runtimeHaxe,在运行时区分匿名函数
【发布时间】:2011-03-08 06:12:10
【问题描述】:

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

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

有没有办法比较那些执行相同任务时功能相同的功能?

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

【问题讨论】:

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


    【解决方案1】:

    一些澄清:

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

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

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

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

    • 您不能序列化函数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多