Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Определить имя функции из тела самой функции (http://www.flasher.ru/forum/showthread.php?t=142444)

himmens 21.07.2010 15:18

Определить имя функции из тела самой функции
 
Всем привет!
Может кто знает, возможно ли определить имя функции (объявленное в каком либо классе) из тела самой функции.

Определить ссылку на функцию легко:
Код AS3:

arguments.callee

А как получить ее имя?

Приведу пример:
Код AS3:

package
{
        import flash.display.Sprite;
 
        public class FunctionsTest extends Sprite
        {
                public function FunctionsTest()
                {
                        super();
                        testFunction();
                }
 
                private function testFunction():void
                {
                        //можно, конечно вывести так
                        trace("testFunction")
                }
        }
}

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

Пробовал через describeType:
Код AS3:

trace(describeType(arguments.callee));

Выдает что-то типа:
Код AS3:

<type name="builtin.as$0::MethodClosure" base="Function" isDynamic="false" isFinal="true" isStatic="false">
  <extendsClass type="Function"/>
  <extendsClass type="Object"/>
  <accessor name="length" access="readonly" type="int" declaredBy="builtin.as$0::MethodClosure"/>
  <accessor name="prototype" access="readwrite" type="*" declaredBy="builtin.as$0::MethodClosure"/>
</type>

Но тут нужной информации нет.

Для чего это нужно? Просто было бы удобно логировать вызовы функций.

Mur4ik 21.07.2010 16:07

В нормальных редакторах (например FD или FDT) есть под это дело плагины или сниппеты, по шорткатам генерируют приятного вида трейсы.

Если интересно самому, гляньте на
Код AS3:

trace(new Error().getStackTrace());

там и имя и строка кода и еще чет полезное найдете для логирования.
Работает только в дебаг плеерах (но вы ведь в таком и тестируете?)

himmens 21.07.2010 19:07

Да это, конечно, даст информацию о точке вызова.
Можно даже извратнуться и взять регулярку от результата, что-то типа:
Код AS3:

trace((new Error().getStackTrace()).match(/\/(.*?)\(/is)[1]);

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

Mur4ik 21.07.2010 19:24

Цитата:

Сообщение от himmens (Сообщение 923956)
Но в итоге выглядит страшно...:(

Т.е по вашему решение с describeType выглядело бы не таким страшным? :)
Весь этот "страх" можно запихнуть в пакедж-левел функцию один раз и больше этого не видеть.

Даже если вы пишете код во Flash CS*, скорее всего есть возможность написать JSFL команду, которая вам сгенерирует нужного вида трейс.

himmens 21.07.2010 23:39

Цитата:

Сообщение от Mur4ik (Сообщение 923960)
Весь этот "страх" можно запихнуть в пакедж-левел функцию один раз и больше этого не видеть.

Согласен. Чем и решил заняться, написав небольшую утилитную функцию:
Код AS3:

public static function getFunctionName():String
{
        var res:String = "";
        var stack:String = new Error().getStackTrace();
        if (stack) {
                var match:Array = stack.match(/getFunctionName.*?at.*?\/(.*?)\(/is);
                if (match.length >= 2)
                        res = match[1];
        }
        return res;
}

Таким образом, теперь определение имени функции выглядит так:
Код AS3:

trace(FunctionUtil.getFunctionName());

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


Часовой пояс GMT +4, время: 22:49.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.