Visizplatītākais konstrukts a Delfi pieteikums būtu a procedūra vai funkcija. Pazīstami kā rutīnas, procedūras vai funkcijas ir paziņojumu bloki, no kuriem zvanāt no dažādām programmas vietām.
Vienkārši sakot, procedūra ir rutīna, kas neatgriež vērtību, kamēr funkcija atgriež vērtību.
Funkcijas atgriešanās vērtību nosaka atgriešanās tips. Vairumā gadījumu jūs ierakstītu funkciju atgriezt vienu vērtību tas būtu vesels skaitlis, virkne, Būla vai kāds cits vienkāršs tips, kā arī atgriešanās veidi varētu būt masīvs, virkņu saraksts, pielāgota objekta piemērs vai tamlīdzīgi.
Ņemiet vērā, ka pat tad, ja jūsu funkcija atgriež virkņu sarakstu ( stīgas) tas joprojām atgriež vienu vērtību: virkņu saraksta viens eksemplārs.
Turklāt Delphi rutīnām patiešām var būt daudz seju: rutīna, metode, metodes rādītājs, notikumu deleģētājs, anonīma metode ...
Vai funkcija var atgriezt vairākas vērtības?
Pirmā atbilde, kas ienāk prātā, ir nē, vienkārši tāpēc, ka, domājot par funkciju, mēs domājam par vienu atdeves vērtību.
Protams, atbilde uz iepriekš minēto jautājumu ir jā. Funkcija var atgriezt vairākas vērtības. Redzēsim kā.
Var parametri
Cik vērtības var atgriezties sekojošā funkcija, vienu vai divas?
funkcija Pozitīvs savstarpējais (const valueIn: vesels skaitlis; var valueOut: real): Būla;
Funkcija acīmredzami atdod Būla vērtību (patiesa vai nepatiesa). Kā būtu ar otro parametru "valueOut", kas deklarēts kā "VAR" (mainīgs) parametrs?
Var parametri tiek nodoti funkcijai pēc atsauces kas nozīmē, ka, ja funkcija maina parametra vērtību - mainīgo koda izsaucēja blokā -, funkcija mainīs parametram izmantotā mainīgā vērtību.
Lai redzētu, kā darbojas iepriekš minētais, ir šāda ieviešana:
funkcija Pozitīvs savstarpējais (const valueIn: vesels skaitlis; var valueOut: real): Būla;
sākt
rezultāts: = valueIn> 0;
ja rezultāts tad valueOut: = 1 / valueIn;
beigas;
"ValueIn" tiek nodots kā nemainīgs parametrs - funkcija to nevar mainīt, un to uzskata par tikai lasāmu.
Ja "valueIn" vai lielāks par nulli, parametram "valueOut" tiek piešķirta savstarpējā vērtība "valueIn", un funkcijas rezultāts ir patiess. Ja valueIn ir <= 0, tad funkcija atgriež nepatiesu un "valueOut" netiek nekādā veidā mainīta.
Šis ir lietojums:
var
b: Būla;
r: reāls;
sākt
r: = 5;
b: = pozitīvs savstarpējais (1, r);
//here:
// b = patiess (kopš 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = pozitīvs abpusējs (-1, r);
//here:
// b = nepatiess (kopš -1
beigas;
Tāpēc PositiveReciprocal faktiski var "atgriezt" 2 vērtības! Izmantojot var parametrus, jūs varat regulāri atgriezt vairāk nekā vienu vērtību.
Ārējie parametri
Ir vēl viens veids, kā norādīt atsauces parametru, izmantojot atslēgvārdu “out”, kā norādīts:
funkcija PositiveReciprocalOut (const valueIn: vesels skaitlis; ārā valueOut: real): Būla;
sākt
rezultāts: = valueIn> 0;
ja rezultāts tad valueOut: = 1 / valueIn;
beigas;
PositiveReciprocalOut ieviešana ir tāda pati kā PositiveReciprocal, ir tikai viena atšķirība: "valueOut" ir OUT parametrs.
Ja parametri tiek deklarēti kā "out", atsauces mainīgā lieluma "valueOut" sākotnējā vērtība tiek atmesta.
Šis ir lietojums un rezultāti:
var
b: Būla;
r: reāls;
sākt
r: = 5;
b: = PositiveReciprocalOut (1, r);
//here:
// b = patiess (kopš 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = pozitīvs savstarpējais iznākums (-1, r);
//here:
// b = nepatiess (kopš -1
beigas;
Ņemiet vērā, kā otrajā izsaukumā vietējā mainīgā "r" vērtība tiek iestatīta uz "0". "R" vērtība pirms funkcijas izsaukšanas tika iestatīta uz 5, bet kopš parametrs tika deklarēts kā "ārā", kad "r" sasniedza funkciju, vērtība tika atmesta, un parametram tika iestatīta noklusējuma "tukša" vērtība (reālā 0) tips).
Tā rezultātā jūs varat droši sūtīt neinicializētus mainīgo parametrus - kaut ko tādu, kas jums nebūtu jādara ar “var” parametriem. Parametri tiek izmantoti, lai kaut ko nosūtītu uz rutīnu, izņemot šeit ar parametriem "out" :), un tāpēc neinicializētiem mainīgajiem (izmanto VAR parametriem) varētu būt dīvainas vērtības.
Vai atgriezt ierakstus?
Iepriekš minētie implementācijas, kurās funkcijai būtu vairāk nekā viena vērtība, nav patīkami. Funkcija faktiski atgriež vienu vērtību, bet arī, labāk sakot, maina var / out parametru vērtības.
Tāpēc ļoti reti jūs vēlēsities izmantot atsauces parametrus. Ja funkcijai ir nepieciešami vairāk rezultātu, funkcija var tikt atgriezta a ieraksta tips mainīgs.
Apsveriet šādus apstākļus:
tips
TLatitudeLongitude = ieraksts
Platums: reāls;
Garums: reāls;
beigas;
un hipotētiska funkcija:
funkcija Kur es esmu(const townName: virkne): TLatitudeLongitude;
Funkcija WhereAmI atgriezīs Platums un garums konkrētai pilsētai (pilsētai, rajonam, ...).
Īstenošana būtu šāda:
funkcija Kur es esmu(const townName: virkne): TLatitudeLongitude;
sākt// izmantojiet kādu pakalpojumu, lai atrastu "townName", pēc tam piešķiriet funkcijas rezultātu:
rezultāts. Platums: = 45,54;
rezultāts. Garums: = 18,71;
beigas;
Un šeit mums ir funkcija, kas atdod 2 reālās vērtības. Ok, tas atgriež 1 ierakstu, bet šim ierakstam ir 2 lauki. Ņemiet vērā, ka jums var būt ļoti sarežģīts ieraksts, sajaucot dažādus veidus, kas tiek atgriezti funkcijas rezultātā.
Tieši tā. Tāpēc, jā, Delphi funkcijas var atgriezt vairākas vērtības.