Проверка подписей анонимных функций во время выполнения (отражения) в AS3 - PullRequest
4 голосов
/ 02 декабря 2008

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

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

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

Ответы [ 2 ]

4 голосов
/ 08 декабря 2008

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

Анонимные функции (возможно, по определению) помечены как 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 будет неправильной.

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

1 голос
/ 02 декабря 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...