Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.07.2010, 15:18
himmens вне форума Посмотреть профиль Отправить личное сообщение для himmens Найти все сообщения от himmens
  № 1  
Ответить с цитированием
himmens

Регистрация: Jun 2010
Адрес: Москва
Сообщений: 8
По умолчанию Определить имя функции из тела самой функции

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

Определить ссылку на функцию легко:
Код 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>
Но тут нужной информации нет.

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

Старый 21.07.2010, 16:07
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 2  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
В нормальных редакторах (например FD или FDT) есть под это дело плагины или сниппеты, по шорткатам генерируют приятного вида трейсы.

Если интересно самому, гляньте на
Код AS3:
trace(new Error().getStackTrace());
там и имя и строка кода и еще чет полезное найдете для логирования.
Работает только в дебаг плеерах (но вы ведь в таком и тестируете?)
__________________
trace("Остановите Землю, я сойду!!!");

Старый 21.07.2010, 19:07
himmens вне форума Посмотреть профиль Отправить личное сообщение для himmens Найти все сообщения от himmens
  № 3  
Ответить с цитированием
himmens

Регистрация: Jun 2010
Адрес: Москва
Сообщений: 8
Да это, конечно, даст информацию о точке вызова.
Можно даже извратнуться и взять регулярку от результата, что-то типа:
Код AS3:
trace((new Error().getStackTrace()).match(/\/(.*?)\(/is)[1]);
Это выведет название функции в которой сгенерирована ошибка.
Но в итоге выглядит страшно, лучше по прежнему пользоваться трейсами и дублировать имена функций...

Старый 21.07.2010, 19:24
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 4  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Цитата:
Сообщение от himmens Посмотреть сообщение
Но в итоге выглядит страшно...
Т.е по вашему решение с describeType выглядело бы не таким страшным?
Весь этот "страх" можно запихнуть в пакедж-левел функцию один раз и больше этого не видеть.

Даже если вы пишете код во Flash CS*, скорее всего есть возможность написать JSFL команду, которая вам сгенерирует нужного вида трейс.
__________________
trace("Остановите Землю, я сойду!!!");


Последний раз редактировалось Mur4ik; 21.07.2010 в 19:26.
Старый 21.07.2010, 23:39
himmens вне форума Посмотреть профиль Отправить личное сообщение для himmens Найти все сообщения от himmens
  № 5  
Ответить с цитированием
himmens

Регистрация: Jun 2010
Адрес: Москва
Сообщений: 8
Цитата:
Сообщение от Mur4ik Посмотреть сообщение
Весь этот "страх" можно запихнуть в пакедж-левел функцию один раз и больше этого не видеть.
Согласен. Чем и решил заняться, написав небольшую утилитную функцию:
Код 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, время: 19:57.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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