Jak zwrócić wiele wartości z funkcji Delphi

Najczęstszy konstrukt w Delfy wniosek byłby procedura lub funkcja. Znane jako procedury, procedury lub funkcje są blokami instrukcji, które wywołujesz z różnych lokalizacji w programie.

Po prostu procedura jest procedurą, która nie zwraca wartości, podczas gdy funkcja zwraca wartość.

Wartość zwracana z funkcji jest definiowana przez typ zwracany. W większości przypadków piszesz funkcję do zwraca pojedynczą wartość która może być liczbą całkowitą, łańcuchem, wartością logiczną lub innym prostym typem, zwracanymi typami mogą być również tablica, lista ciągów, instancja obiektu niestandardowego lub podobne.

Zauważ, że nawet jeśli twoja funkcja zwraca listę ciągów (zbiór smyczki) nadal zwraca jedną wartość: jedno wystąpienie listy ciągów.

Co więcej, procedury Delphi mogą naprawdę mieć wiele twarzy: rutyna, metoda, wskaźnik metody, delegat zdarzenia, metoda anonimowa ...

Czy funkcja może zwrócić wiele wartości?

Pierwszą odpowiedzią na to pytanie jest nie, po prostu dlatego, że kiedy myślimy o funkcji, myślimy o pojedynczej wartości zwracanej.

instagram viewer

Oczywiście odpowiedź na powyższe pytanie brzmi: tak. Funkcja może zwrócić kilka wartości. Zobaczmy jak.

Parametry Var

Ile wartości może zwrócić następująca funkcja, jedna lub dwie?

funkcjonować PositiveReciprocal (const valueIn: liczba całkowita; var valueOut: real): boolean;

Funkcja oczywiście zwraca wartość logiczną (prawda lub fałsz). A co z drugim parametrem „valueOut” zadeklarowanym jako parametr (zmienny) „VAR”?

Parametry Var są przekazywane do funkcji przez odniesienie co oznacza, że ​​jeśli funkcja zmieni wartość parametru - zmiennej w wywołującym bloku kodu - funkcja zmieni wartość zmiennej użytej dla parametru.

Aby zobaczyć, jak działa powyższe, oto implementacja:

funkcjonować PositiveReciprocal (const valueIn: liczba całkowita; var valueOut: real): boolean;

zaczynać

 wynik: = wartość In> 0;

gdyby wynik następnie valueOut: = 1 / valueIn;

koniec;

„ValueIn” jest przekazywane jako parametr stały - funkcja nie może go zmienić i jest traktowane jako tylko do odczytu.

Jeśli „valueIn” lub większe od zera, parametrowi „valueOut” przypisywana jest odwrotność wartości „valueIn”, a wynik funkcji jest prawdziwy. Jeśli valueIn wynosi <= 0, wówczas funkcja zwraca false, a „valueOut” nie jest w żaden sposób zmieniany.

Oto użycie:

var

 b: boolean;

 r: prawdziwy;

zaczynać

 r: = 5;

 b: = PositiveReciprocal (1, r);

 //here:

 // b = true (od 1> = 0)

 // r = 0,2 (1/5)

 r: = 5;

 b: = PositiveReciprocal (-1, r);

 //here:

 // b = false (od -1 

koniec;

Dlatego PositiveReciprocal faktycznie może „zwrócić” 2 wartości! Używając parametrów var, możesz mieć rutynowy zwrot więcej niż jednej wartości.

Nasze parametry

Istnieje inny sposób na określenie parametru odniesienia poprzez użycie słowa kluczowego „out”, na przykład:

funkcjonować PositiveReciprocalOut (const valueIn: liczba całkowita; na zewnątrz valueOut: real): boolean;

zaczynać

 wynik: = wartość In> 0;

gdyby wynik następnie valueOut: = 1 / valueIn;

koniec;

Implementacja PositiveReciprocalOut jest taka sama jak w PositiveReciprocal, istnieje tylko jedna różnica: „valueOut” jest parametrem OUT.

W przypadku parametrów zadeklarowanych jako „out” wartość początkowa przywoływanej zmiennej „valueOut” jest odrzucana.

Oto użycie i wyniki:

var

 b: boolean;

 r: prawdziwy;

zaczynać

 r: = 5;

 b: = PositiveReciprocalOut (1, r);

 //here:

 // b = true (od 1> = 0)

 // r = 0,2 (1/5)

 r: = 5;

 b: = PositiveReciprocalOut (-1, r);

 //here:

 // b = false (od -1 

koniec;

Zwróć uwagę, że w drugim wywołaniu wartość zmiennej lokalnej „r” jest ustawiona na „0”. Wartość „r” została ustawiona na 5 przed wywołaniem funkcji, ale ponieważ parametr został zadeklarowany jako „out”, gdy „r” osiągnął funkcję, wartość została odrzucona i dla parametru ustawiono domyślną wartość „pustą” (0 dla wartości rzeczywistej rodzaj).

W rezultacie możesz bezpiecznie wysyłać niezainicjowane zmienne dla naszych parametrów - czego nie powinieneś robić z parametrami „var”. Parametry są używane do wysyłania czegoś do procedury, z wyjątkiem tutaj parametrów „out” :), a zatem niezainicjowane zmienne (używane dla parametrów VAR) mogą mieć dziwne wartości.

Zwracane rekordy?

Powyższe implementacje, w których funkcja zwraca więcej niż jedną wartość, nie są ładne. Funkcja faktycznie zwraca pojedynczą wartość, ale także zwraca, lepiej powiedzieć zmienia, wartości parametrów var / out.

Z tego powodu bardzo rzadko możesz chcieć używać parametrów odniesienia. Jeśli wymagane są więcej wyników z funkcji, możesz zwrócić funkcję a typ rekordu zmienna.

Rozważ następujące:

rodzaj

 TLatitudeLongitude = rekord

 Szerokość geograficzna: prawdziwa;

 Długość geograficzna: prawdziwa;

koniec;

oraz funkcja hipotetyczna:

funkcjonować Gdzie ja jestem(const nazwa miasta: strunowy): TLatitudeLongitude;

Funkcja WhereAmI zwróci Szerokość i długość geograficzna dla danego miasta (miasto, obszar, ...).

Wdrożenie byłoby:

funkcjonować Gdzie ja jestem(const nazwa miasta: strunowy): TLatitudeLongitude;

zaczynać// użyj usługi do zlokalizowania „townName”, a następnie przypisz wynik funkcji:

 wynik. Szerokość geograficzna: = 45,54;

 wynik. Długość geograficzna: = 18,71;

koniec;

I tutaj mamy funkcję zwracającą 2 wartości rzeczywiste. Ok, zwraca 1 rekord, ale ten rekord ma 2 pola. Zauważ, że możesz mieć bardzo złożony rekord mieszający różne typy, które zostaną zwrócone w wyniku działania funkcji.

Otóż ​​to. Dlatego tak, funkcje Delphi mogą zwracać wiele wartości.

instagram story viewer