Haxe, дифференцировать анонимную функцию во время выполнения - PullRequest
0 голосов
/ 08 марта 2011

Я пытаюсь отличить анонимные функции, такие как:

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 Ответ

4 голосов
/ 08 марта 2011

Несколько уточнений:

  • Первые два опубликованных вами примера практически идентичны. Разница лишь в том, что вы назначили секунду статической переменной. Вы могли бы использовать статическую функцию напрямую, с тем главным отличием, что в этом случае функция не может быть изменена. Если вы хотите сделать это, вам следует добавить модификатор dynamic.

  • Начиная с последней версии, вы можете иметь локальные именованные функции:

    static f() { function a() { trace("hi"); }; a() }
    
  • Для правильного сравнения методов следует использовать Reflect.compareMethods(). Иногда Haxe создает замыкания вокруг функций, что может нарушить равенство.

  • Можно сравнить функцию ссылки , но не функцию тел . Таким образом, ответ - нет, вы не можете сравнивать функции, которые генерируются в разных выражениях, но делают одно и то же.

  • Вы не можете сериализовать функции.

  • Возможно, вы можете найти какой-то платформенный способ справиться с этой ситуацией, или Macro может также подойти (для создания сигнатур функций), но я думаю, что вам легче перестроить ваш код. Другой вариант - принять библиотеку, подобную hscript , для тех вызовов, которые должны быть сопоставимы и сериализуемы.

...