Najbežnejší konštrukt v a Delphi žiadosť by bola postup alebo funkcia. Známe ako rutiny, procedúry alebo funkcie sú bloky príkazov, ktoré voláte z rôznych miest v programe.
Jednoducho povedané postup je rutina, ktorá nevracia hodnotu, zatiaľ čo funkcia vracia hodnotu.
Návratová hodnota z funkcie je definovaná typom návratu. Vo väčšine prípadov by ste napísali funkciu vráti jednu hodnotu to by bolo celé číslo, reťazec, booleovský alebo nejaký iný jednoduchý typ, tiež návratové typy by mohli byť pole, zoznam reťazcov, inštancia vlastného objektu alebo podobne.
Všimnite si, že aj keď vaša funkcia vráti zoznam reťazcov (kolekcia reťazce) stále vracia jednu hodnotu: jedna inštancia zoznamu reťazcov.
Ďalej môžu mať rutiny Delphi skutočne veľa tvárí: rutina, metóda, ukazovateľ metódy, delegát udalostí, anonymná metóda ...
Môže funkcia vrátiť viac hodnôt?
Prvá odpoveď na túto otázku nie je, jednoducho preto, že keď uvažujeme o nejakej funkcii, myslíme na jedinú návratnú hodnotu.
Odpoveď na vyššie uvedenú otázku je však určite áno. Funkcia môže vrátiť niekoľko hodnôt. Pozrime sa ako.
Parametre var
Koľko hodnôt môže nasledujúca funkcia vrátiť, jednu alebo dve?
funkcie PositiveReciprocal (const valueIn: celé číslo; var valueOut: real): boolean;
Funkcia samozrejme vracia booleovskú hodnotu (true alebo false). A čo druhý parameter "valueOut" deklarovaný ako parameter "VAR" (variabilný)?
Var parametre sú odovzdané do funkcie odkazom čo znamená, že ak funkcia zmení hodnotu parametra - premennej vo volajúcom bloku kódu - funkcia zmení hodnotu premennej použitej pre parameter.
Ak chcete vidieť, ako vyššie uvedené funguje, tu je implementácia:
funkcie PositiveReciprocal (const valueIn: celé číslo; var valueOut: real): boolean;
začať
výsledok: = valueIn> 0;
ak následok potom valueOut: = 1 / valueIn;
koniec;
"ValueIn" sa odovzdáva ako konštantný parameter - funkcia ho nemôže zmeniť a považuje sa iba za čítanie.
Ak je hodnota „valueIn“ alebo väčšia ako nula, parametru „valueOut“ sa priradí recipročná hodnota „valueIn“ a výsledok funkcie je pravdivý. Ak valueIn je <= 0, funkcia vráti false a "valueOut" sa žiadnym spôsobom nemení.
Tu je použitie:
var
b: boolovský;
r: skutočný;
začať
r: = 5;
b: = pozitívny recipročný (1, r);
//here:
// b = true (od 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = pozitívny recipročný (-1, r);
//here:
// b = false (od -1
koniec;
Preto PositiveReciprocal skutočne môže „vrátiť“ 2 hodnoty! Pomocou parametrov var môžete získať rutinnú návratnosť viac ako jednej hodnoty.
Parametre
Existuje aj iný spôsob, ako určiť parameter referencie - pomocou kľúčového slova „out“, ako v:
funkcie PositiveReciprocalOut (const valueIn: celé číslo; von valueOut: real): boolean;
začať
výsledok: = valueIn> 0;
ak následok potom valueOut: = 1 / valueIn;
koniec;
Implementácia PositiveReciprocalOut je rovnaká ako v PositiveReciprocal, existuje iba jeden rozdiel: „valueOut“ je parameter OUT.
Pri parametroch deklarovaných ako „out“ sa počiatočná hodnota referenčnej premennej „valueOut“ vyradí.
Tu je použitie a výsledky:
var
b: boolovský;
r: skutočný;
začať
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;
Všimnite si, ako pri druhom volaní je hodnota lokálnej premennej "r" nastavená na "0". Hodnota „r“ bola nastavená na 5 pred volaním funkcie, ale pretože parameter bol deklarovaný ako „out“, keď „r“ dosiahla funkciu, bola hodnota zahodená a pre parameter bola nastavená predvolená „prázdna“ hodnota (0 pre reálnu hodnotu typ).
Výsledkom je, že môžete bezpečne odosielať neinicializované premenné pre parametre out - niečo, čo by ste nemali robiť s parametrami „var“. Parametre sa používajú na poslanie niečoho do rutiny, s výnimkou tu s "out" parametrami :), a preto by neinicializované premenné (použité pre parametre VAR) mohli mať divné hodnoty.
Vracajú sa záznamy?
Vyššie uvedené implementácie, v ktorých by funkcia vrátila viac ako jednu hodnotu, nie sú pekné. Funkcia skutočne vracia jedinú hodnotu, ale tiež vracia, lepšie povedané, hodnoty var / out parametrov.
Z tohto dôvodu možno budete chcieť veľmi zriedka používať parametre vedľajšej referencie. Ak sú potrebné ďalšie výsledky z funkcie, môžete mať funkciu návrat a typ záznamu variabilné.
Zvážte nasledujúce:
typ
TLatitudeLongitude = rekord
Zemepisná šírka: skutočná;
Zemepisná dĺžka: skutočná;
koniec;
a hypotetická funkcia:
funkcie Kde som(const townName: povrázok): TLatitudeLongitude;
Funkcia WhereAmI by vrátila Zemepisná šírka a dĺžka pre dané mesto (mesto, oblasť, ...).
Implementácia bude:
funkcie Kde som(const townName: povrázok): TLatitudeLongitude;
začať// pomocou nejakej služby vyhľadajte názov mesta a potom priraďte výsledok funkcie:
vyplývať. Zemepisná šírka: = 45,54;
vyplývať. Zemepisná dĺžka: = 18,71;
koniec;
A tu máme funkciu, ktorá vracia 2 reálne hodnoty. Ok, vráti 1 záznam, ale tento záznam obsahuje 2 polia. Všimnite si, že v dôsledku funkcie môžete mať veľmi zložitý záznam kombinujúci rôzne typy.
To je všetko. Preto môžu funkcie Delphi vrátiť viac hodnôt.