AutoIt/Funkcje
Funkcje
edytujFunc...EndFunc
edytujFunkcje w AutoIt są kawałkami kodu, który można wywołać, podając jego nazwę. Deklaruje się je pomiędzy Func a EndFunc.
Func nazwa_funkcji(<lista_argumentów>) ... <kod który funkcja ma wykonać> ... EndFunc
Funkcje wykorzystuje się po to, by nie pisać kilkukrotnie identycznego kodu, ew. podobnego, ale o innych parametrach. Redukujemy w ten sposób rozmiar skryptu, co znacząco przyczynia się do jego uproszczenia.
Przykład:
Func test() ;"test" to nazwa funkcji, nawiasy są obowiązkowe nawet gdy nie ma argumentów
MsgBox(4,"Test","to jest MsgBox wywołany z funkcji")
EndFunc
W ten sposób zadeklarowaliśmy funkcję, po uruchomieniu programu jednak nic się nie dzieje. Aby wywołać funkcję wystarczy podać jej nazwę:
test()
Func test()
MsgBox(4,"Test","to jest MsgBox wywołany z funkcji")
EndFunc
Nie ma znaczenia, gdzie deklarujemy funkcje. Dla wygody i czytelności programu najlepiej jest umieścić je na samym końcu kodu.
W nawiasie możemy umieścić parametry przekazywane do funkcji:
test("To jest przykład wykorzystania")
test("parametru funkcji, oczywiście")
test("funkcje nie służą tylko do wyświetlania")
test("prostych MsgBox'ów ;-)")
Func test($tekst)
MsgBox(4,"Test",$tekst)
EndFunc
W ten prosty sposób, nie musimy powtarzać tego samego kawałku kodu (wyświetlanie MsgBox'a) - podaliśmy tylko parametr (w tym przypadku ciąg znaków), na których funkcja opiera swoje działanie. Oczywiście, funkcja może mieć więcej niż jeden parametr.
Prosta funkcja przedstawiająca sumę 2 parametrów:
dodaj(5,2)
Func dodaj($a,$b)
$c = $a + $b
MsgBox(4,"Suma: ", $c)
EndFunc
Możliwe jest utworzenie funkcji, do której w zależności od potrzeb możemy przekazywać różne ilości parametrów. Konieczne jest wtedy zadeklarowanie domyślnej wartości parametrów, które są opcjonalne. Ilość przekazanych do funkcji parametrów możemy odczytać za pomocą makra @NumParams.
Przykład (wypisuje ilość parametrów przekazanych do funkcji):
test() ;wypisze liczbę 0
test(1) ;wypisze liczbę 1
test(1,1) ;wypisze liczbę 2
test(5,6,7) ;wypisze liczbę 3
Func test($1=0,$2=0,$3=0)
MsgBox(4,"Ilość parametrów",@NumParams)
EndFunc
Domyślne wartości funkcji mogą być zadeklarowane jako wyrażenie:
test() ;wyświetli 0
test(1) ;wyświetli 2
test(1,1) ;wyświetli 4
test(1,1,1) ;wyświetli 3
Func test( $a=0, $b=0, $c=$a+$b)
MsgBox( 0, "", $a+$b+$c)
EndFunc
Należy jednak zachować ostrożność, gdyż pozornie identyczna funkcja:
Func test( $c=$a+$b, $a=0, $b=0)
MsgBox(0,"",$a+$b+$c)
EndFunc
spowoduje wystąpienie błędu. Wynika to z kolejności przypisywania wartości parametrom. Przypisywanie odbywa się od lewej strony nawiasu do prawej. W momencie przypisywania wartości parametrowi $c nie jest jeszcze znana wartość $a i $b.
UWAGA: Próba przekazania do funkcji większej ilości parametrów niż zadeklarowana spowoduje wystąpienie błędu.
Return
edytujFunkcja może również być wykorzystana do zwrócenia określonej wartości. Służy do tego komenda Return.
W tym przykładzie funkcja zwraca dzisiejszą datę w formacie mm/dd/yyyy:
MsgBox(1, "aktualna data", dzis())
Func dzis()
Return (@MON & "/" & @MDAY & "/" & @YEAR)
EndFunc
Return ma podwójne działanie:
- natychmiastowe opuszczenie funkcji
- zwrócenie przez funkcję podanej wartości. Jeżeli po Return nie podamy żadnej wartości, to zwrócone będzie 0.
Jeżeli w definicji funkcji nie będzie użyte Return, to zakończenie działania funkcji nastąpi po osiągnięciu EndFunc, a funkcja zwróci 0.
Parametry przekazywane do funkcji oraz wartości zwracane przez funkcję mogą być także typu tablicowego np.(funkcja zwraca tablicę utworzoną z przekazanych do niej parametrów, przy czy parametr drugi i trzeci są opcjonalne):
Func tablica($1,$2=0,$3=0)
Local $tab[3]=[$1,$2,$3]
Return $tab
EndFunc
W tym przypadku w wywołaniu funkcji możemy pominąć tylko końcowe parametry, te którym nadano domyślne wartości.
Default
edytujJeżeli chcemy aby domyślne wartości mogły przyjąć dowolne parametry należy użyć słowa kluczowego Default, a domyślne wartości parametrów zdefiniować wewnątrz funkcji:
MyFunc(Default,Default,Default) ;wyświetli Jeden Dwa Trzy
MyFunc(Default,Default,"Pięć") ;wyświetli Jeden Dwa Pięć
MyFunc(Default,"Pięć",Default) ;wyświetli Jeden Pięć Trzy
Func MyFunc($Param1 = Default, $Param2 = Default, $Param3 = Default)
If $Param1 = Default Then $Param1 = 'Jeden'
If $Param2 = Default Then $Param2 = 'Dwa'
If $Param3 = Default Then $Param3 = 'Trzy'
MsgBox(0, 'Parametr', $Param1 & @LF & $Param2 & @LF & $Param3)
EndFunc
IsKeyword
edytujPowyższy przykład można także zrealizować z przy użyciu zdefiniowanej w języku funkcji IsKeyword. Funkcja ta zwraca wartość 1 gdy argument ma wartość Default lub 2 gdy Null (dla innych wartości argumentu zwraca 0):
MyFunc(Default,Default,Default) ;wyświetli Jeden Dwa Trzy
MyFunc(Default,Default,"Pięć") ;wyświetli Jeden Dwa Pięć
MyFunc(Default,"Pięć",Default) ;wyświetli Jeden Pięć Trzy
Func MyFunc($Param1 = Default, $Param2 = Default, $Param3 = Default)
If IsKeyword($Param1)=1 Then $Param1 = 'Jeden'
If IsKeyword($Param2)=1 Then $Param2 = 'Dwa'
If IsKeyword($Param3)=1 Then $Param3 = 'Trzy'
MsgBox(0, 'Parametr', $Param1 & @LF & $Param2 & @LF & $Param3)
EndFunc
ByRef, Const
edytujParametry przekazywane do funkcji mogą być zadeklarowane poleceniem ByRef lub Const.
Const oznacza, że parametr jest stałą i nie może być zmieniony wewnątrz funkcji.
ByRef oznacza, że ewentualne działania wewnątrz funkcji będą wykonywane bezpośrednio na zmiennej przekazywanej do funkcji, a nie na jej kopi. Może to znacznie przyśpieszyć działanie programu, zwłaszcza przy operowaniu na dużych zmiennych tablicowych. Dodatkowo ByRef jest stosowana dla obsługi obiektów ActiveX. W takim przypadku także przyśpiesza to działanie programu, równocześnie nie powoduje zwiększenia zapotrzebowania na pamięć RAM.
Przykład:
Dim $a=1, $b=1
test($a,$b)
MsgBox(64, "Test", "$a = " & $a & @LF & "$b = " & $b)
Func test(ByRef $par1, $par2)
$par1=2 ;nastąpi także zmiana wartości zmiennej $a na 2
$par2=2 ;natomiast zmienna $b nie ulegnie zmianie
EndFunc
Jeżeli chcemy użyć ByRef dla drugiego lub dalszego parametru, to w definicji funkcji po przecinku musi być obowiązkowo spacja, w przeciwnym razie wystąpi błąd.
Przykład:
Func test1($par1, ByRef $par2) ;dobrze
;treść funkcji test1
EndFunc
Func test2($par1,ByRef $par2) ;błąd
;treść funkcji test2
EndFunc
W AutoIt nie ma rozróżnienia (jak np. w Pascalu) między funkcją, a procedurą.
Każda funkcja może być wywołana w sposób proceduralny, tzn. bez zwracania wartości:
suma(2,5) ;wywołanie proceduralne (bez zwracania wartości)
$liczba=suma(2,5) ;wywołanie funkcyjne (ze zwróceniem wartości)
Func suma($a,$b)
Local $suma
$suma=$a+$b
MsgBox(,"Suma wynosi",$suma)
Return $suma
EndFunc
Pierwsze wywołanie funkcji spowoduje wyświetlenie komunikatu, drugie dodatkowo przypisze zmiennej $liczba wartość zwróconą przez tę funkcję.