Come restituire più valori da una funzione Delphi

Un costrutto più comune in a Delphi l'applicazione sarebbe a procedura o una funzione. Conosciuti come routine, procedure o funzioni sono blocchi di istruzioni chiamati da diverse posizioni in un programma.

In poche parole, una procedura è una routine che non restituisce un valore mentre una funzione restituisce un valore.

Un valore restituito da una funzione è definito dal tipo restituito. Nella maggior parte dei casi si scriverà una funzione restituisce un singolo valore che sarebbe un numero intero, una stringa, un valore booleano o un altro tipo semplice, anche i tipi restituiti potrebbero essere un array, un elenco di stringhe, un'istanza di un oggetto personalizzato o simili.

Nota che anche se la tua funzione restituisce un elenco di stringhe (una raccolta di stringhe) restituisce comunque un singolo valore: un'istanza dell'elenco di stringhe.

Inoltre, le routine Delphi possono davvero avere molte facce: routine, metodo, puntatore metodo, delegato evento, metodo anonimo ...

Una funzione può restituire più valori?

instagram viewer

La prima risposta che viene in mente è no, semplicemente perché quando pensiamo a una funzione, pensiamo a un singolo valore di ritorno.

Certamente, la risposta alla domanda di cui sopra è, tuttavia, sì. Una funzione può restituire diversi valori. Vediamo come.

Parametri var

Quanti valori può restituire la seguente funzione, una o due?

funzione PositiveReciprocal (const valueIn: intero; var valueOut: real): booleano;

La funzione ovviamente restituisce un valore booleano (vero o falso). Che ne dici del secondo parametro "valueOut" dichiarato come parametro "VAR" (variabile)?

Parametri var vengono passati alla funzione come riferimento ciò significa che se la funzione modifica il valore del parametro — una variabile nel blocco di codice chiamante — la funzione cambierà il valore della variabile utilizzata per il parametro.

Per vedere come funziona quanto sopra, ecco l'implementazione:

funzione PositiveReciprocal (const valueIn: intero; var valueOut: real): booleano;

inizio

 risultato: = valoreIn> 0;

Se risultato poi valueOut: = 1 / valueIn;

fine;

"ValueIn" viene passato come parametro costante: la funzione non può modificarlo e viene considerato di sola lettura.

Se "valueIn" o maggiore di zero, al parametro "valueOut" viene assegnato il valore reciproco di "valueIn" e il risultato della funzione è true. Se valueIn è <= 0, la funzione restituisce false e "valueOut" non viene modificato in alcun modo.

Ecco l'uso:

var

 b: booleano;

 r: reale;

inizio

 r: = 5;

 b: = PositiveReciprocal (1, r);

 //here:

 // b = true (poiché 1> = 0)

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

 r: = 5;

 b: = PositiveReciprocal (-1, r);

 //here:

 // b = false (dal -1 

fine;

Pertanto, PositiveReciprocal può effettivamente "restituire" 2 valori! Utilizzando i parametri var è possibile avere un ritorno di routine più di un valore.

Parametri fuori

Esiste un altro modo per specificare un parametro per riferimento, utilizzando la parola chiave "out", come in:

funzione PositiveReciprocalOut (const valueIn: intero; su valueOut: real): booleano;

inizio

 risultato: = valoreIn> 0;

Se risultato poi valueOut: = 1 / valueIn;

fine;

L'implementazione di PositiveReciprocalOut è la stessa di PositiveReciprocal, c'è solo una differenza: "valueOut" è un parametro OUT.

Con i parametri dichiarati come "out", il valore iniziale della variabile referenziata "valueOut" viene scartato.

Ecco l'uso e i risultati:

var

 b: booleano;

 r: reale;

inizio

 r: = 5;

 b: = PositiveReciprocalOut (1, r);

 //here:

 // b = true (poiché 1> = 0)

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

 r: = 5;

 b: = PositiveReciprocalOut (-1, r);

 //here:

 // b = false (dal -1 

fine;

Notare come nella seconda chiamata il valore della variabile locale "r" è impostato su "0". Il valore di "r" è stato impostato su 5 prima della chiamata della funzione ma poiché il parametro in è stato dichiarato "out", quando "r" ha raggiunto la funzione il valore è stato scartato e il valore "vuoto" predefinito è stato impostato per il parametro (0 per reale genere).

Di conseguenza, è possibile inviare in modo sicuro variabili non inizializzate per i parametri out, cosa che non si dovrebbe fare con i parametri "var". I parametri vengono utilizzati per inviare qualcosa alla routine, tranne qui con parametri "out" :), e quindi le variabili non inizializzate (utilizzate per i parametri VAR) potrebbero avere valori strani.

Restituire i record?

Le implementazioni di cui sopra in cui una funzione restituisce più di un valore non sono utili. La funzione in realtà restituisce un singolo valore, ma restituisce anche, meglio dire altera, i valori dei parametri var / out.

Per questo motivo, molto raramente potresti voler utilizzare i parametri per riferimento. Se sono richiesti più risultati da una funzione, è possibile avere una funzione restituire a tipo di registrazione variabile.

Considera quanto segue:

genere

 TLatitudeLongitude = disco

 Latitudine: reale;

 Longitudine: reale;

fine;

e una funzione ipotetica:

funzione Dove sono(const townName: corda): TLatitudeLongitude;

La funzione WhereAmI restituisce Latitudine e longitudine per una determinata città (città, area, ...).

L'attuazione sarebbe:

funzione Dove sono(const townName: corda): TLatitudeLongitude;

inizio// usa alcuni servizi per localizzare "townName", quindi assegna il risultato della funzione:

 risultato. Latitudine: = 45,54;

 risultato. Longitudine: = 18.71;

fine;

E qui abbiamo una funzione che restituisce 2 valori reali. Ok, restituisce 1 record, ma questo record ha 2 campi. Nota che puoi avere un record molto complesso che mescola vari tipi da restituire come risultato di una funzione.

Questo è tutto. Pertanto, sì, le funzioni Delphi possono restituire più valori.

instagram story viewer