Funkcje mogą wykonywać czynności. Funkcja może na przykład zwrócić wartość, gdy zostanie wywołana. Ta wartość to wynik.
Kiedy na przykład wywołasz GetRandomInt(1, 10), oczekujesz, że otrzymasz losową liczbę całkowitą z przedziału od 1 do 10.
Aby zmienić typ wartości, który chcesz otrzymać z funkcji, musisz zmienić typ w sygnaturze funkcji. Na przykład:
GetNumberOfMousetrapsYouCanAfford() : int
W tym przykładzie funkcja GetNumberOfMousetrapsYouCanAfford() ma typ zwracany int, więc za każdym razem, gdy wywołasz funkcję GetNumberOfMousetrapsYouCanAfford() w kodzie, możesz oczekiwać, że zwróci ona liczbę całkowitą.
GetNumberOfMousetrapsYouCanAfford() : float
Jeśli natomiast zmienisz typ na float, zwróci ona inny rodzaj wartości.
Gdy funkcja ma określony typ zwracany, ciało funkcji (blok kodu) musi wygenerować wynik zgodny z tym typem. W przeciwnym razie kod nie skompiluje się, co oznacza, że występuje błąd kompilatora. Chcesz się dowiedzieć, jak tego uniknąć?
Wyniki i wartości zwracane
Wynik jest wartością, którą funkcja zwraca, gdy jest wykonywana (uruchamiana).
W lekcji 2 powiedzieliśmy sobie o słowach kluczowych, czyli specjalnych słowach wbudowanych w Verse, do których przypisane są bardzo konkretne działania.
W Verse słowo return również jest słowem kluczowym, które nakazuje funkcji podanie wartości wynikającej z wyrażenia następującego po słowie kluczowym return.
MyFunction() : int =
return 5
OnBegin<override>()<suspend> : void =
MyFunction() # result is 5
W powyższym przykładzie po wywołaniu funkcji MyFunction() kod zwróci wartość 5.
Pominięcie słowa kluczowego return nie popsuje funkcji, ale dobrą praktyką jest jawne dołączenie return. Więcej informacji na ten temat znajdziesz w sekcji Funkcje.
Wcześniejsze powroty
Gdy program wykona wyrażenie return, natychmiast przerwie on wykonywanie bloku kodu funkcji. Oznacza to, że jeśli wyrażenie return zostanie umieszczone przed innym kodem, następujący po nim kod nie zostanie wykonany. Może to być przydatne do wcześniejszego zakończenia funkcji po spełnieniu określonego warunku.
Poniższa funkcja aktualizuje zmienną Coins na podstawie CoinsPerMouseTrap. Jednak zmienna Coins musi mieć wartość dodatnią, aby można było kupić pułapkę na myszy. Jeśli zmienna Coins ma wartość ujemną, funkcja wypisuje komunikat o błędzie i natychmiast wykonuje powrót, ponieważ nie ma sensu, aby uruchamiać resztę kodu w ciele funkcji.
Tak naprawdę bez powrotu funkcja niepoprawnie zmniejszałaby wartość Coins i nigdy nie wskazywałaby, że zmienna Coins ma wartość ujemną.
var Coins : int = -10
CoinsPerMousetrap : int = 100
BuyMousetrap() : void =
if (Coins < 0):
Print("Error: Coins set to negative value")
return
set Coins = Coins - CoinsPerMousetrap
Print(“Mousetrap bought! You have {Coins} coins left.”)
Wcześniejsze zakończenie funkcji za pomocą wyrażenia return może spowodować wystąpienie błędów, więc ważne jest, aby używać go ostrożnie. Na przykład w poniższym kodzie wyrażenie return zostanie uruchomione przed Print(“Pułapka na myszy została kupiona! Pozostało ci monet: {Coins}.”), zatem funkcja nigdy nie wyświetli nowej wartości zmiennej Coins.
var Coins : int = 500
CoinsPerMousetrap : int = 100
BuyMousetrap() : void =
if (Coins < 0):
Print("Error: Coins set to negative value")
return
set Coins = Coins - CoinsPerMousetrap
return
Print("Mousetrap bought! You have {Coins} coins left.")
Jeśli masz w kodzie wyrażenie return oznaczające wcześniejszy powrót, kod nadal się skompiluje, ale Visual Studio Code ostrzeże cię, że wyrażenia po return nie zostaną uruchomione.
Pusty typ danych (void) dla funkcji bez przydatnego wyniku
Czasami chcesz uzyskać wynik, czasami nie.
Jeśli pamiętasz typy, które omawialiśmy w trakcie lekcji 2, to pewnie pamiętasz też, że każdy typ wymaga konkretnego rodzaju wartości. Poniższa lista jest bardzo skrótowa. W Verse używanych jest wiele typów, ale te są najczęściej używane i stanowią podstawę korzystania ze zmiennych i stałych.
| Typ | Efekt działania | Wartości |
|---|---|---|
| Ten typ wartości może mieć wyłącznie wartość true lub false. | true / false |
| Typ int to liczba całkowita (nie ułamkowa); | Liczby całkowite |
| Ten typ jest przeznaczony dla wartości, które nie są liczbami całkowitymi, na przykład ułamków. | Liczby z miejscami dziesiętnymi |
| Ten typ to dowolny rodzaj tekstu. Mogą to być litery, cyfry, znaki interpunkcyjne, spacje, a nawet emoji. 😻 | Litery, cyfry, znaki interpunkcyjne, spacje, emoji |
W przypadku tworzenia funkcji, która nie musi generować wyniku, można zdefiniować typ informacji zwrotnej funkcji o nazwie void.
To oznacza, że ostatnie wyrażenie w bloku kodu może wygenerować wynik dowolnego typu bez generowania błędu kompilatora, ponieważ typ funkcji jest ustawiony na void.
W przypadku funkcji typu void także można używać słowa kluczowego return – po prostu nie trzeba podawać wartości ze słowem kluczowym return.
Podsumowanie
Wynik jest tym, co otrzymujesz z funkcji po jej wywołaniu.
W bloku kodu ostatnie wyrażenie wygeneruje wynik.
Aby zmienić typ wartości w funkcji, musisz zmienić typ w sygnaturze funkcji.
Return jest słowem kluczowym, które nakazuje funkcji dostarczenie wartości wynikającej z następującego po nim wyrażenia.
Wcześniejszy powrót ma miejsce, gdy słowo kluczowe return zostanie użyte w bloku kodu przed jego zakończeniem. Spowoduje to natychmiastowe przerwanie tego bloku kodu, bez uruchamiania reszty kodu w tym bloku.
Void jest typem, który mówi, że wartość funkcji nie będzie używana w żadnym innym miejscu. A może mówi, że po prostu nie warto zawracać sobie tym głowy. Typu void można użyć w przypadku funkcji, która nie musi generować wyniku.