0

私は次のような無名関数を区別しようとしています:

function() { trace("WOO"); }

他のものから(「名前付き」?)

var _FUNC:Dynamic = function() { trace("WOO"); }

私がそれをやりたい理由は、2つの異なる関数であるため、2つの匿名関数を比較できないためです。

わかりやすくするために、次の簡単な例を検討してください。

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

いくつかの説明:

  • 投稿した最初の 2 つのサンプルは実質的に同一です。唯一の違いは、2 番目を静的変数に割り当てたことです。静的関数を直接使用することもできますが、主な違いは、その場合、関数を変更できないということです。それを作成したい場合は、dynamic修飾子を追加する必要があります。

  • 最新バージョンから、ローカルの名前付き関数を使用できます。

    static f() { 関数 a() { trace("hi"); }; () }
    
  • メソッドを適切に比較するには、 を使用する必要がありますReflect.compareMethods()。時々、Haxe は関数の周りにクロージャを作成し、それが等価性を破る可能性があります。

  • 関数参照は比較できますが、関数本体は比較できません。したがって、答えはノーです。異なるステートメントで生成された関数を比較することはできませんが、同じことを行います。

  • 関数をシリアル化することはできません。

  • この状況に対処するためのプラットフォーム固有の方法を見つけたり、(関数シグネチャを作成するために) マクロを適用したりすることもできますが、コードを再設計する方が簡単だと思います。別のオプションは、比較可能でシリアライズ可能である必要がある呼び出しにhscriptのような lib を採用することです。

于 2011-03-08T10:11:04.403 に答える