Что нового

Узнаем имя текущей функции

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Для отладки скриптов бывает очень полезно узнать имя исполняемой на данный момент функции.
Конечно можно внутри функции объявить переменную с именем, но мы не ищем легких путей :smile: и поэтому напишем свою функцию которая возвращает имя функции :stars:. Спокойно, счас все покажу :smile:

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

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

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


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

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

Код:
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:

В бетах можно делать проще.
Код:
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 строки.
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
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

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
ivsatel [?]
Версия AutoIT v3.3.8.1
Точно! Постоянно пользуюсь бета версиями и даже не проверил на релизе. Тогда подправлю свой пост и вычеркну требование беты. Спасибо.


Добавлено:
Сообщение автоматически объединено:

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