在AutoIT中将函数作为参数传递

8

我有几个结构相同的函数(简化版):

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个回答

13

出现了一位挑战者!有趣的问题。你可以使用内置的Call函数通过函数名称字符串来调用一个函数。例如,如果你有一个带有参数的名为moveFiles的函数,你可以使用以下代码调用该函数:

Call("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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接