Передача функции в качестве параметра в AutoIT
у меня есть несколько функций с той же структурой (упрощенной):
func moveFiles()
local $error = 1
For $i = 1 to 100
updateProgress($i)
updateStatus("Processing " & $i & "/100 files")
$error *= moveFile($i)
Next
Return $error
endFunc
Я хотел бы сделать эту общую функцию такой:
func doSomething($function)
local $error = 1
For $i = 1 to 100
updateProgress($i)
updateStatus("Processing " & $i & "/100 files")
$error *= $function($i) ;execute the function that was passed
Next
Return $error
endFunc
поэтому я могу сделать так:
doSomething($moveFiles)
doSomething($compareFiles)
doSomething($removeFiles)
...
возможно ли это в AutoIt v3 и как я могу это сделать ?
1 ответов
претендент появляется! Интересный вопрос. Вы можете вызвать функцию по имени в виде строки со встроенным звонком. Например, у вас есть функция moveFiles с параметром, вы можете вызвать эту функцию с помощью:
вызов ("moveFiles", $i)
Я написал пример, который демонстрирует это. Это удобный простой способ выполнения делегатов, событий или обратных вызовов, как вы можете использовать с других строгих языков. В примере я намеренно исключил обработку ошибок, потому что есть два способа сделать это. Вы можете вернуть значение true / false (или 1 / 0) или использовать функцию SetError с макросом @error.
вот полный и рабочий пример:
func doSomething($function)
local $error = 0
For $i = 1 to 5
updateProgress($i)
updateStatus("Processing " & $i & "/100 files")
Call($function, $i)
Next
Return $error
endFunc
doSomething("moveFiles")
doSomething("compareFiles")
;doSomething("removeFiles")
Func moveFiles($i)
ConsoleWrite("Moving file " & $i & @CRLF)
EndFunc
Func compareFiles($i)
ConsoleWrite("Copying file " & $i & @CRLF)
EndFunc
Func updateProgress($i)
ConsoleWrite("Stage processing at #" & $i & @CRLF)
EndFunc
Func updateStatus($msg)
ConsoleWrite($msg & @CRLF)
EndFunc
выход:
Stage processing at #1
Processing 1/5 files
Moving file 1
Stage processing at #2
Processing 2/5 files
Moving file 2
Stage processing at #3
Processing 3/5 files
Moving file 3
Stage processing at #4
Processing 4/5 files
Moving file 4
Stage processing at #5
Processing 5/5 files
Moving file 5
Stage processing at #1
Processing 1/5 files
Copying file 1
Stage processing at #2
Processing 2/5 files
Copying file 2
Stage processing at #3
Processing 3/5 files
Copying file 3
Stage processing at #4
Processing 4/5 files
Copying file 4
Stage processing at #5
Processing 5/5 files
Copying file 5