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)
...

これはAutoItv3で可能ですか?どうすればできますか?

4

1 に答える 1

13

チャレンジャーが登場!興味深い質問です。組み込みのCallを使用して、文字列として名前で関数を呼び出すことができます。たとえば、パラメータを指定してmoveFilesという関数がある場合、次のコマンドでその関数を呼び出すことができます。

Call( "moveFiles"、$ i)

これを示す例を書きました。これは、他の厳密な言語に慣れている場合があるため、デリゲート、イベント、またはコールバックを実行するための便利で簡単な方法です。この例では、2つの方法があるため、意図的にエラー処理を省略しています。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
于 2012-07-25T08:27:23.773 に答える