Автор Тема: Узнаем имя текущей функции  (Прочитано 2200 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 461
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Узнаем имя текущей функции
« Создано: Ноябрь 14, 2013, 23:36:37 »
Для отладки скриптов бывает очень полезно узнать имя исполняемой на данный момент функции.
Конечно можно внутри функции объявить переменную с именем, но мы не ищем легких путей :) и поэтому напишем свою функцию которая возвращает имя функции  :stars:. Спокойно, счас все покажу  :)

Код: AutoIt [Выделить]
Func MyFuncName()
    $sName = 'MyFuncName'
    ConsoleWrite('Я внутри функции '& $sName & ' и меня вызвали из строки 123' & @LF)
EndFunc
 

Не очень удобно да? Если функция переименовывается то нужно не забыть сделать это и в переменной $sName.
Если с этим еще можно смириться, то как быть с и меня вызвали из строки 123??

Было бы не плохо писать так:
Код: AutoIt [Выделить]
Func MyFuncName()
   ConsoleWrite('Я внутри функции '& __funcName() & ' и меня вызвали из строки ' & $from  & @LF)
EndFunc
 


Решений есть. Только сразу скажу что это не будет работать в скомпилированных скриптах.

Вам нужна AutoIT версия 3.3.9.6+ любая именно в ней появилась возможность задавать параметрам функции по умолчанию - выражения.И что это нам дает? А вот что:

Код: AutoIt [Выделить]
Func MyFuncName($from = @ScriptLineNumber)
    ConsoleWrite('Я внутри функции '& __funcName() & ' и меня вызвали из строки ' & $from  & @LF)
EndFunc
Func __funcName($line = @ScriptLineNumber)
    If @Compiled Then Return -1
    Local $is_comment = False, $sLine, $_Temp
    For $fileline = $line - 1 To 1 Step -1
        $sLine = FileReadLine(@ScriptName, $fileline)
        If $is_comment And Not StringRegExp($sLine, '(?i)^\s*(?:#cs|#comments-start)') Then
            ContinueLoop
        Else
            $is_comment = False
        EndIf
        If StringRegExp($sLine, '(?i)^\s*(?:#ce|#comments-end)') Then
            $is_comment = True
            ContinueLoop
        EndIf
        $_Temp = StringRegExp($sLine, '(?i)^\s*Func\s*([^(\s]+)', 1)
        If IsArray($_Temp) Then Return $_Temp[0]
    Next
    Return -1
EndFunc
MyFuncName()

выводит в консоль: Я внутри функции MyFuncName и меня вызвали из строки 23 :IL_AutoIt_1:

В бетах можно делать проще.
Код: AutoIt [Выделить]
TestFunc(3)

Func TestFunc($a,$b = '',$c = '',$funcname = _FuncName())
    ConsoleWrite('Имя этой функции: ' & $funcname & @LF)
EndFunc

Func _FuncName($funcline = @ScriptLineNumber)
    If @Compiled Then Return -1
    Local $_Temp = StringRegExp(FileReadLine(@ScriptName, $funcline), '(?i)^\s*Func\s*([^(\s]+)', 1)
    If IsArray($_Temp) Then Return $_Temp[0]
    Return -1
EndFunc
 

Вывод в консоль:
Имя этой функции: TestFuncВ TestFunc создаем параметр, который вызывает функцию _FuncName.
Тогда код _FuncName сокращается в 4 строки.

« Последнее редактирование: Ноябрь 16, 2013, 13:34:34 от inververs »

Русское сообщество AutoIt

Узнаем имя текущей функции
« Отправлен: Ноябрь 14, 2013, 23:36:37 »

Оффлайн ivsatel [?]

  • Продвинутый
  • ***
  • Сообщений: 319
  • Репутация: 84
  • Пол: Мужской
    • Награды
Re: Узнаем имя текущей функции
« Ответ #1, Отправлен: Ноябрь 15, 2013, 20:17:46 »
inververs  [?]
Цитировать
Вам нужна AutoIT версия 3.3.9.6+ именно в ней появилась возможность задавать параметрам функции по умолчанию - выражения.

Версия AutoIT v3.3.8.1
--> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop
Я внутри функции MyFuncName и меня вызвали из строки 23
+>20:13:23 AutoIt3.exe ended.rc:0

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135

  • Автор темы
  • Репутация: 461
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Узнаем имя текущей функции
« Ответ #2, Отправлен: Ноябрь 15, 2013, 20:32:05 »
ivsatel  [?]
Цитировать
Версия AutoIT v3.3.8.1
Точно! Постоянно пользуюсь бета версиями и даже не проверил на релизе. Тогда подправлю свой пост и вычеркну требование беты. Спасибо.


Добавлено: Ноябрь 15, 2013, 20:43:25
inververs  [?]
Цитировать
именно в ней появилась возможность задавать параметрам функции по умолчанию - выражения
Я имел ввиду вот это:
Код: AutoIt [Выделить]
Test('I Love AutoIT')
Func Test($a, $b = StringLen($a))
    ConsoleWrite($a & ' длина: '& $b & @LF)
EndFunc

« Последнее редактирование: Ноябрь 15, 2013, 20:44:28 от inververs, Причина: Объединение сообщений »

Русское сообщество AutoIt

Re: Узнаем имя текущей функции
« Ответ #2 Отправлен: Ноябрь 15, 2013, 20:32:05 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
4167 Просмотров
Последний ответ Октябрь 24, 2009, 10:06:38
от snoitaleR
110 Ответов
38666 Просмотров
Последний ответ Июль 27, 2010, 17:50:49
от CreatoR
1 Ответов
2830 Просмотров
Последний ответ Август 04, 2011, 23:07:17
от madmasles
14 Ответов
6179 Просмотров
Последний ответ Январь 10, 2012, 03:37:47
от Kaster
10 Ответов
5749 Просмотров
Последний ответ Февраль 08, 2012, 23:13:58
от alex842
1 Ответов
2259 Просмотров
Последний ответ Октябрь 15, 2012, 10:17:39
от C2H5OH
4 Ответов
7152 Просмотров
Последний ответ Август 08, 2013, 13:35:12
от mef-t
2 Ответов
1388 Просмотров
Последний ответ Июль 20, 2014, 17:51:06
от madmasles
9 Ответов
1842 Просмотров
Последний ответ Декабрь 12, 2015, 23:19:55
от Alofa
2 Ответов
445 Просмотров
Последний ответ Декабрь 05, 2017, 11:11:21
от joparezzz