Come restituire più valori da una funzione Delphi

Su parametri di procedura/funzione e tipi restituiti: Var, Out, Record

Un costrutto più comune in a Delfi l'applicazione sarebbe a procedura o una funzione . Conosciute come routine, procedure o funzioni sono blocchi di istruzioni che si chiamano 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 scriveresti una funzione su restituire un unico valore che sarebbe un intero, una stringa, un booleano o qualche 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 al metodo, delegato di eventi, metodo anonimo...



Una funzione può restituire più valori?

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 più valori. Vediamo come.

Parametri Var

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

|_+_||_+_|

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



Parametri variabili vengono passati alla funzione come riferimento il che significa che se la funzione cambia 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:



|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|

'valueIn' viene passato come parametro costante: la funzione non può modificarlo ed è 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 then the function returns false and 'valueOut' is not altered in any way.



Ecco l'utilizzo:

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

Pertanto, il PositiveReciprocal può effettivamente 'restituire' 2 valori! Usando i parametri var puoi fare in modo che una routine restituisca più di un valore.



Fuori parametri

C'è un altro modo per specificare un parametro per riferimento, usando la parola chiave 'out', come in:

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|

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 di riferimento 'valueOut' viene scartato.

Ecco l'utilizzo e i risultati:

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

Si noti come nella seconda chiamata il valore della variabile locale 'r' sia impostato su '0'. Il valore di 'r' è stato impostato su 5 prima della chiamata alla funzione ma poiché il parametro è stato dichiarato come 'out', quando 'r' ha raggiunto la funzione il valore è stato scartato ed è stato impostato il valore predefinito 'vuoto' per il parametro (0 per tipo reale).

Di conseguenza, puoi inviare in sicurezza variabili non inizializzate per i parametri out, cosa che non dovresti fare con i parametri 'var'. I parametri sono usati per inviare qualcosa alla routine, tranne qui con i parametri 'out' :), e quindi le variabili non inizializzate (usate per i parametri VAR) potrebbero avere valori strani.

Restituire i record?

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

Per questo motivo, molto raramente potresti voler utilizzare parametri per riferimento. Se sono richiesti più risultati da una funzione, è possibile fare in modo che una funzione restituisca aConsidera quanto segue:

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|

e una funzione ipotetica:

|_+_||_+_|

La funzione WhereAmI restituirebbe il Latitudine e longitudineper una data città (città, area, ...).

L'implementazione sarebbe:

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|

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.