2012-07-25 16 views
8

Mam kilka funkcji o tej samej strukturze (uproszczony):Przechodząc do funkcji jako parametr w 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 

Chciałbym, aby ten rodzajowy funkcja tak:

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 

Tak mogę zrobić tak:

doSomething($moveFiles) 
doSomething($compareFiles) 
doSomething($removeFiles) 
... 

jest to możliwe w AutoIt v3 i jak mogę to zrobić?

Odpowiedz

12

Pojawia się pretendent! Interesujące pytanie. Możesz wywołać funkcję według ich nazwy jako ciąg z wbudowanym Call. Na przykład masz funkcję o nazwie moveFiles z parametrem, można wywołać tę funkcję z:

połączenie („moveFiles”, $ I)

Pisałem przykład ilustrujący to. Jest to wygodny prosty sposób na wykonywanie delegatów, zdarzeń lub wywołań zwrotnych, ponieważ możesz być przyzwyczajony do innych języków. W tym przykładzie celowo pominąłem obsługę błędów, ponieważ są na to dwa sposoby. Możesz zwrócić wartość true/false (lub 1/0) lub możesz użyć funkcji SetError z makrem @error.

Oto pełna i pracuje przykład:

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 

wyjściowa:

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 
Powiązane problemy