Проверка сигнатур анонимных функций во время выполнения (рефлексия) в AS3

Есть ли способ посмотреть сигнатуры анонимных функций в ActionScript 3 во время выполнения?

Я хотел бы проверить объекты Function, переданные в качестве аргументов другим функциям, и убедиться, что они принимают правильное количество аргументов (с правильными типами) и возвращают значение правильного типа.

flash.utils.describeType(), похоже, не возвращает эту информацию для анонимных функций.


person hasseg    schedule 02.12.2008    source источник
comment
Эй, hasseg, вы должны рассмотреть возможность добавления вашего скрытого комментария в качестве ответа на эту проблему: пусть вызов вызовет исключение ArgumentException и перехватит его. Это очень прагматичное решение, если вы просто хотите вызвать функцию, если она действительна.   -  person aaaidan    schedule 13.05.2010


Ответы (2)


Не похоже, что среда выполнения позволяет вам размышлять об анонимных функциях, а это позор.

Анонимные функции (возможно, по определению) помечены как dynamic. Если вы передаете несовместимый тип в анонимную функцию, ошибка не возникает. Любые несоответствия типов будут автоматически отбрасываться, насколько это возможно. Передача чего-то вроде "minotaur" в качестве параметра uint даст, например, 0 (ноль).

Если вы ДЕЙСТВИТЕЛЬНО хотите перепроектировать его, вы можете получить на нем все ООП. Вместо того, чтобы принимать анонимные функции, вы можете объявить интерфейс, содержащий соответствующую сигнатуру функции, и принять объекты, реализующие этот интерфейс.

public interface IFancyCallback {
  public function fancyFunction(frog:Frog, princess:Girl):UsefulReturnType;
}

И ваша функция просто должна быть упакована в объект:

public class ConcreteCallback implements IFancyCallback {
  public function fancyFunction(frog:Frog, princess:Girl):UsefulReturnType {
    princess.kiss(frog);
    return new UsefulReturnType("jabberwocky");
  }
}

Может иметь потенциал для создания большого количества накладных расходов кода. Зависит от того, сколько обратных вызовов вы намерены иметь, кто будет их делать и насколько серьезным будет, если сигнатура анонимной функции будет неверной.

Можете ли вы рассказать больше о проблеме, которую вы пытаетесь решить?

person aaaidan    schedule 08.12.2008
comment
Спасибо за ответ - я понятия не имел, что ошибки не возникнут, если вы попытаетесь передать аргументы неправильных типов. - person hasseg; 08.12.2008

В качестве грубого приближения вы можете проверить количество параметров, используя свойство длины, например:

function doStuff(callback:Function) {
  trace(callback.length);
}

Я не знаю, как перечислить аргументы анонимных функций; вы, конечно, можете проверить ex-post перехват ArgumentError.

person Luca Tettamanti    schedule 02.12.2008
comment
Спасибо - теперь, когда я думаю об этом, на самом деле это не проблема, если я не проверяю функцию, а вместо этого просто позволяю вызову генерировать ArgumentException, если подпись недействительна, поскольку, вероятно, я бы сделал это в любом случае :) - person hasseg; 03.12.2008