在 AutoIT 中将函数作为参数传递
Posted
技术标签:
【中文标题】在 AutoIT 中将函数作为参数传递【英文标题】:Passing a function as parameter in AutoIT 【发布时间】:2012-07-23 14:31:33 【问题描述】:我有几个具有相同结构的函数(简化):
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】:挑战者出现了!有趣的问题。您可以使用内置 Call 将函数名称作为字符串调用。例如,您有一个名为 moveFiles 且带有参数的函数,您可以使用以下命令调用该函数:
调用("moveFiles", $i)
我写了一个例子来证明这一点。这是一种执行委托、事件或回调的方便简单的方法,就像您在其他严格的语言中可能习惯的那样。在示例中,我故意省略了错误处理,因为有两种方法可以做到这一点。您可以返回一个真/假(或 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
【讨论】:
以上是关于在 AutoIT 中将函数作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章
如何在 CoffeeScript 中将两个匿名函数作为参数传递?