inververs
AutoIT Гуру
- Сообщения
- 2,135
- Репутация
- 465
Для отладки скриптов бывает очень полезно узнать имя исполняемой на данный момент функции.
Конечно можно внутри функции объявить переменную с именем, но мы не ищем легких путей и поэтому напишем свою функцию которая возвращает имя функции :stars:. Спокойно, счас все покажу
Не очень удобно да? Если функция переименовывается то нужно не забыть сделать это и в переменной $sName.
Если с этим еще можно смириться, то как быть с и меня вызвали из строки 123??
Было бы не плохо писать так:
Решений есть. Только сразу скажу что это не будет работать в скомпилированных скриптах.
Вам нужна AutoIT версия 3.3.9.6+ любая именно в ней появилась возможность задавать параметрам функции по умолчанию - выражения.И что это нам дает? А вот что:
:IL_AutoIt_1:
В бетах можно делать проще.
Вывод в консоль:
В TestFunc создаем параметр, который вызывает функцию _FuncName.
Тогда код _FuncName сокращается в 4 строки.
Конечно можно внутри функции объявить переменную с именем, но мы не ищем легких путей и поэтому напишем свою функцию которая возвращает имя функции :stars:. Спокойно, счас все покажу
Код:
Func MyFuncName()
$sName = 'MyFuncName'
ConsoleWrite('Я внутри функции '& $sName & ' и меня вызвали из строки 123' & @LF)
EndFunc
Не очень удобно да? Если функция переименовывается то нужно не забыть сделать это и в переменной $sName.
Если с этим еще можно смириться, то как быть с и меня вызвали из строки 123??
Было бы не плохо писать так:
Код:
Func MyFuncName()
ConsoleWrite('Я внутри функции '& __funcName() & ' и меня вызвали из строки ' & $from & @LF)
EndFunc
Решений есть. Только сразу скажу что это не будет работать в скомпилированных скриптах.
Код:
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
В бетах можно делать проще.
Код:
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
Тогда код _FuncName сокращается в 4 строки.