2012-07-25 32 views
8

ho un paio di funzioni con la stessa struttura (semplificato):Passando una funzione come parametro nella 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 

Vorrei rendere questo una funzione generica come questa:

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 

Così posso fare così:

E 'possibile in AutoIt v3 e come posso farlo?

risposta

12

Appare uno sfidante! Domanda interessante È possibile chiamare una funzione in base al proprio nome come stringa con la chiamata integrata. Per esempio si dispone di una funzione denominata Sposta file con un parametro, si può chiamare tale funzione con:

chiamata ("Sposta file", $ i)

ho scritto un esempio che illustra questo. È un modo semplice e conveniente di fare delegati, eventi o callback a cui potresti essere abituato da altre lingue rigorose. Nell'esempio ho intenzionalmente omesso la gestione degli errori perché ci sono due modi per farlo. È possibile restituire un valore true/false (o 1/0) oppure utilizzare la funzione SetError con la macro @error.

Ecco l'esempio completo e funzionante:

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 

uscita:

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 
Problemi correlati