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

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

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

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

Привет, hasseg, тебе следует подумать о добавлении своего скрытого комментария в качестве ответа на эту проблему: «пусть вызов вызовет исключение ArgumentException» и перехватит его. Это очень прагматичное решение, если вы просто хотите вызвать функцию, если она действительна.

aaaidan 13.05.2010 13:44
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
Пройдите собеседование по Angular: Общие вопросы и ответы экспертов
Пройдите собеседование по Angular: Общие вопросы и ответы экспертов
Можете ли вы объяснить разницу между ngOnInit и конструктором в Angular?
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
4
1
1 871
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

Спасибо - теперь, когда я думаю об этом, на самом деле это не проблема, если я не проверяю функцию и вместо этого просто позволяю вызову генерировать исключение ArgumentException, если подпись недействительна, поскольку это, вероятно, то, что я бы сделал в любом случае :)

hasseg 03.12.2008 13:42
Ответ принят как подходящий

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

Анонимные функции (возможно, по определению) помечены как 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 08.12.2008 16:02

Другие вопросы по теме