和一般程式語言一樣, AutoIt 也可自定義函式。自定義函式寫法如下
Func 函式名稱(引數)
函式本體內容
(return something)
EndFunc
其中 return 則視函式是否有傳回值而定。
1. 引數內容不需改變
假設寫一函式,引數為 $x,傳回 1+2+3+...+$x,則該函式可這麼寫
; function
Func SumFunc($n)
$sum=0
For $i=1 To $n
$sum = $sum+$i
Next
return $sum
EndFunc
到時要調用時,可這麼使用
$x = 5
$sum1 = SumFunc($x) ; $sum1 = 1+2+3+4+5
$sum2 = SumFunc(10) ; $sum2 = 1+2+3+...+10
2. 不改變引數內容 - 給引數預設值
在說這個之前,我們再詳細看一次 MsgBox 的原型是長怎樣
MsgBox ( 旗標, "標題", "文字" [, 逾時 [, 主控制碼(hwnd)] )
上面橘色部份就是選填部份。所謂的選填部份就是可以寫也可以不寫,如果不寫的話就照著預設值跑。如果我們要設定 1 秒後就把這個 MsgBox 關閉的話,可以這麼做
MsgBox(0, "Title", "Text", 1);
這裡我只多了一個引數 -> 1,代表的是逾時時間,但有時我們只想設第五個引數而不想要設第四個引數,第四個引數那對我們而已可能沒意義,於是我們可以用 Default 帶過第四個引數。
MsgBox(0, "title", "Text", Default, 1000)
這樣就可以跳過第四個引數,直接設第5個引數。接著如果自己寫的函式要有預設值功能的話,就直接在函式的引數裡面加上去。直接看例子比較快
Func MyFunc($a=1, $b=10)
return $a+$b
EndFunc
$x1 = MyFunc() ; 直接使用二個預設引數 1, 10, 故 $x1 = 1+10 = 11
$x2 = MyFunc(5) ; 第一個引數用 5,第二個引數用預設引數 10,故 $x2 = 5 + 10 = 15
$x3 = MyFunc(Default, 5) ; 第一個引數用預設引數 1,第二個引數用 5,故 $x3 = 1 + 5 = 6
函式裡面加入適當的預設引數,可以減少不少設計時的繁雜。
3. 改變引數內容
假設我們寫了一函式要交換二數值,於是我們寫下了這麼一段Swap1函式
Dim $x=10, $y=5
Swap1($x, $y)
MsgBox(0, "交換後", $x & " " &$y)
; SWAP1
Func Swap1($a, $b)
$t = $a
$a = $b
$b = $t
EndFunc
最後結果會發現, $x 和 $y 的內容並未改變。若要在函式中改變其內容,必須在引數裡使用 ByRef 方式宣告,改寫後之 Swap2 如下
Dim $x=10, $y=5
Swap2($x, $y)
MsgBox(0, "交換後", $x & " " &$y)
; SWAP2
Func Swap2(ByRef $a, ByRef $b)
$t = $a
$a = $b
$b = $t
EndFunc
最後 $x 與 $y 值便會交換。
4. Recursive 遞回函式
遞回函式在其它程式語言裡面很常被用到,如果讀者先前沒有程式語言的經驗,這裡只要想做是 "遞回函式" 是 "函式自己會再呼叫自己", "等到一定條件之後,函式會再次結束"。遞回函式這技巧在程式語言很重要,許多很複雜的問題 (如河內塔問題) 可經由遞回函式解決。在此只介紹簡單的遞回應用(雖這個例子用不到遞回,但有心的話請多加練習這個技巧):現在假設要寫 1+2+...+N 的遞回,遞回的概念將會是這麼運作:
(1) Sum(N) = N + Sum(N-1)
(2) Sum(N) = N + (N-1 + Sum(N-2) )
(3) Sum(N) = N + N-1 + ( N-2 + Sum(N-3) )....
....
(N-1) Sum(N) = N + N-1 + ... + N-2 + .... + 3 + Sum(2)
(N) Sum(N) = N + N-1 + ... + N-2 + .... + 3 + 2 + Sum(1)
好了,最後的 Sum(1) 時,我們就丟回去給它 1。函式寫法如下:
$Sum = RecursiveSum(10)
MsgBox(0, "總合", "$sum=" & $Sum)
Func RecursiveSum($X)
If $X=1 Then
Return 1
Else
Return $X + RecursiveSum($X-1)
EndIf
EndFunc