Kaip sugrąžinti kelias vertes iš „Delphi“ funkcijos

Labiausiai paplitęs konstruktas a Delfi taikymas būtų a procedūra ar funkcija. Žinomos kaip rutinos, procedūros ar funkcijos yra teiginių blokai, į kuriuos skambinate iš skirtingų programos vietų.

Paprasčiau tariant, procedūra yra įprasta negrąžinti vertės, o funkcija grąžina vertę.

Funkcijos grąžinimo reikšmė nustatoma pagal grąžinimo tipą. Daugeliu atvejų jūs parašytumėte funkciją grąžinti vieną vertę tai būtų sveikasis skaičius, eilutė, loginė ar koks nors kitas paprastas tipas, taip pat grįžimo tipai gali būti masyvas, styginių sąrašas, pasirinktinio objekto egzempliorius ar panašiai.

Atminkite, kad net jei jūsų funkcija grąžina eilučių sąrašą ( stygos) vis tiek grąžina vieną reikšmę: vieną eilutės sąrašo egzempliorių.

Be to, „Delphi“ rutinos iš tikrųjų gali turėti daug veidų: įprastas, metodas, metodo rodyklė, įvykio dalyvis, anoniminis metodas ...

Ar funkcija gali grąžinti kelias vertes?

Pirmas atsakymas, kuris ateina į galvą, ne, vien todėl, kad galvodami apie funkciją mes galvojame apie vieną grąžos vertę.

instagram viewer

Be abejo, atsakymas į aukščiau pateiktą klausimą yra taip. Funkcija gali grąžinti keletą reikšmių. Pažiūrėkime kaip.

Var parametrai

Kiek verčių gali grąžinti ši funkcija, viena ar dvi?

funkcija Teigiamas abipusis (const valueIn: sveikasis skaičius; var valueOut: real): boolean;

Funkcija akivaizdžiai grąžina loginę reikšmę (teisinga arba klaidinga). O kaip antrasis parametras „valueOut“, deklaruotas kaip „VAR“ (kintamasis) parametras?

Var parametrai perduodami funkcijai pagal nuorodą tai reiškia, kad jei funkcija pakeis parametro - kintamojo kodo skambinimo bloke - vertę, funkcija pakeis parametrui naudojamo kintamojo vertę.

Norėdami pamatyti, kaip veikia aukščiau, pateikiame įgyvendinimą:

funkcija Teigiamas abipusis (const valueIn: sveikasis skaičius; var valueOut: real): boolean;

prasideda

 rezultatas: = valueIn> 0;

jei rezultatas tada valueOut: = 1 / valueIn;

galas;

„ValueIn“ perduodamas kaip pastovus parametras - funkcija negali jo pakeisti ir laikoma tik skaitoma.

Jei „valueIn“ arba didesnis nei nulis, parametrui „valueOut“ priskiriama abipusė reikšmė „valueIn“, o funkcijos rezultatas yra tikras. Jei valueIn yra <= 0, tada funkcija grąžina klaidingą ir „valueOut“ jokiu būdu nekeičiama.

Štai vartojimas:

var

 b: boolean;

 r: tikras;

prasideda

 r: = 5;

 b: = teigiamas abipusis (1, r);

 //here:

 // b = teisinga (nes 1> = 0)

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

 r: = 5;

 b: = teigiamas abipusis (-1, r);

 //here:

 // b = klaidinga (nuo -1 

galas;

Todėl „PositiveReciprocal“ iš tikrųjų gali „grąžinti“ 2 reikšmes! Naudodami var parametrus, galite gauti įprastinę grąžą daugiau nei vieną reikšmę.

Išėjimo parametrai

Yra dar vienas būdas nurodyti nuorodos parametrą, naudojant „out“ raktinį žodį, kaip nurodyta:

funkcija „PositiveReciprocalOut“ (const valueIn: sveikasis skaičius;  valueOut: real): boolean;

prasideda

 rezultatas: = valueIn> 0;

jei rezultatas tada valueOut: = 1 / valueIn;

galas;

„PositiveReciprocalOut“ įdiegimas yra tas pats kaip ir „PositiveReciprocal“, yra tik vienas skirtumas: „valueOut“ yra OUT parametras.

Kai parametrai deklaruojami kaip „out“, nurodomo kintamojo „valueOut“ pradinė vertė yra atmesta.

Štai vartojimas ir rezultatai:

var

 b: boolean;

 r: tikras;

prasideda

 r: = 5;

 b: = „PositiveReciprocalOut“ (1, r);

 //here:

 // b = teisinga (nes 1> = 0)

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

 r: = 5;

 b: = „PositiveReciprocalOut“ (-1, r);

 //here:

 // b = klaidinga (nuo -1 

galas;

Atkreipkite dėmesį, kaip antrojo skambučio metu vietinio kintamojo „r“ vertė yra nustatyta „0“. „R“ reikšmė buvo nustatyta 5 prieš funkcijos iškvietimą, bet kadangi parametras deklaruojamas kaip „out“, kai „r“ pasiekė funkciją, vertė buvo atmesta, o parametrui buvo nustatyta numatytoji "tuščia" reikšmė (0 - tikra tipas).

Dėl to galite saugiai siųsti neinicializuotus parametrų išvestinius kintamuosius - to, ko neturėtumėte daryti su „var“ parametrais. Parametrai yra naudojami norint ką nors nusiųsti į rutiną, išskyrus čia su „out“ parametrais :), todėl neinicializuoti kintamieji (naudojami VAR parametrams) gali turėti keistas reikšmes.

Grąžinate įrašus?

Aukščiau išvardyti diegimai, kai funkcija grąžina daugiau nei vieną reikšmę, nėra malonūs. Funkcija iš tikrųjų grąžina vieną vertę, bet taip pat, geriau sakant, keičia var / out parametrų reikšmes.

Dėl šios priežasties labai retai norėsite naudoti atskaitos parametrus. Jei reikia daugiau funkcijos rezultatų, galite grąžinti funkciją a įrašo tipas kintamasis.

Apsvarstykite šiuos dalykus:

tipo

 TLatitudeLongitude = įrašas

 Platuma: tikra;

 Ilguma: tikra;

galas;

ir hipotetinė funkcija:

funkcija Kur aš esu(const townName: stygos): TLatitudeLongitude;

Funkcija WhereAmI grąžins Platuma ir ilguma tam tikram miestui (miestui, rajonui, ...).

Įgyvendinimas būtų:

funkcija Kur aš esu(const townName: stygos): TLatitudeLongitude;

prasideda// naudokite kažkokią paslaugą, kad surastumėte „townName“, tada priskirkite funkcijos rezultatą:

 rezultatas. Platuma: = 45,54;

 rezultatas. Ilguma: = 18,71;

galas;

Ir čia mes turime funkciją, grąžinančią 2 tikrąsias vertybes. Gerai, kad jis grąžina 1 įrašą, tačiau šis įrašas turi 2 laukus. Atminkite, kad galite turėti labai sudėtingą įrašą, maišant įvairius tipus, kuriuos reikia grąžinti dėl funkcijos.

Viskas. Taigi, taip, „Delphi“ funkcijos gali grąžinti kelias vertes.

instagram story viewer