【问题标题】:Passing a function as parameter in AutoIT在 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 中是否可行?我该怎么做?

【问题讨论】:

    标签: function generics parameters autoit


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2021-04-13
      • 2023-04-02
      • 2011-02-13
      • 2013-08-25
      • 2016-02-16
      • 2013-10-30
      • 2013-05-23
      相关资源
      最近更新 更多