2012-07-25 77 views
8

傳遞函數爲參數我有相同的結構(簡化)的幾個功能:在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中,我該怎麼做?

回答

12

挑戰者出現!有趣的問題。您可以通過內置Call​​調用一個名稱爲函數的函數。例如你有一個調用的參數moveFiles功能,可以調用該函數:

呼叫(「moveFiles」,$ I)

我已經寫了證明這樣一個例子。這是一種方便簡單的方法,可以用來從其他嚴格的語言中使用委託,事件或回調。在這個例子中,我故意忽略了錯誤處理,因爲有兩種方法可以做到這一點。您可以返回true/false(或1/0)值,也可以使用帶有@error宏的SetError函數。

下面是滿滿的,工作例如:

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