Есть ли способ просмотреть подписи анонимных функций в ActionScript 3 во время выполнения?
Я хотел бы проверить объекты Function, переданные в качестве аргументов другим функциям, и убедиться, что они принимают правильное количество аргументов (с правильными типами) и возвращают значение правильного типа.
Flash.utils.describeType(), похоже, не возвращает эту информацию для анонимных функций.
В качестве грубого приближения вы можете проверить количество параметров, используя свойство длины, например:
function doStuff(callback:Function) {
trace(callback.length);
}
Я не знаю способа перечислить аргументы анонимных функций; вы, конечно, можете проверить ошибку ArgumentError после перехвата.
Спасибо - теперь, когда я думаю об этом, на самом деле это не проблема, если я не проверяю функцию и вместо этого просто позволяю вызову генерировать исключение ArgumentException, если подпись недействительна, поскольку это, вероятно, то, что я бы сделал в любом случае :)
Не похоже, что среда выполнения позволяет вам размышлять об анонимных функциях, что очень досадно.
Анонимные функции (возможно, по определению) помечены как 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");
}
}
Может создавать много накладных расходов на код. Зависит от того, сколько обратных вызовов вы собираетесь использовать, кто их будет делать, и насколько серьезно это было бы, если бы подпись функции anon была неправильной.
Не могли бы вы рассказать еще о проблеме, которую пытаетесь решить?
Спасибо за ответ - я понятия не имел, что не возникнет ошибок, если вы попытаетесь передать аргументы неправильного типа.
Привет, hasseg, тебе следует подумать о добавлении своего скрытого комментария в качестве ответа на эту проблему: «пусть вызов вызовет исключение ArgumentException» и перехватит его. Это очень прагматичное решение, если вы просто хотите вызвать функцию, если она действительна.