domenica 15 marzo 2026

GDScript - Funzioni, il tipo void, la parola chiave return

Godot - GDScriptSe le variabili sono i contenitori dei dati di gioco, le funzioni sono i motori che li mettono in movimento. In termini semplici, una funzione è un blocco di codice isolato che esegue un compito specifico. Invece di scrivere la stessa sequenza di istruzioni ogni volta che un nemico subisce danni o un giocatore salta, si racchiudono quelle istruzioni in una funzione e si "chiama" (si invoca) ogni volta che occorre. L'obiettivo principale delle funzioni è rendere il codice modulare, leggibile e riutilizzabile. Ecco i vantaggi principali:

  • evitare ripetizioni: si scrive il codice una volta e si usa ovunque;
  • organizzazione: le funzioni permettono di dividere un problema complesso in piccoli "pezzi" gestibili (ad esempio, una funzione per calcola_punteggio() e una per aggiorna_interfaccia());
  • astrazione: una volta creata una funzione, non occorre più preoccuparsi di come faccia una cosa, basta sapere cosa fa quando la si invoca.

Dichiarare una funzione

In GDScript, le funzioni vengono definite con la parola chiave func seguita dal nome della funzione. Possono ricevere informazioni dall'esterno (parametri) e restituire un risultato al termine del loro lavoro tramite l'istruzione return. I parametri sono racchiusi tra una coppia di parentesi tonde, sono opzionali e, se più di uno, sono separati da virgole. Quando una funzione restituisce un risultato, occorre specificarne il tipo: dopo le parentesi tonde dei parametri, bisogna inserire i due caratteri "->" ed il tipo di ritorno. Infine, la dichiarazione della funzione termina con i due punti ":". Dopo di questi, segue il corpo della funzione (ossia le istruzioni che la compongono), indentato rispetto alla dichiarazione.

La sintassi per dichiarare una funzione e definirne il corpo, assume una delle seguenti forme (consiglio di usare sempre la terza modalità, con tipo di ritorno esplicitamente dichiarato):

func nome_funzione(): # senza parametri
# corpo della funzione

func nome_funzione(parametro_1, ..., parametro_n):
# corpo della funzione

func nome_funzione(<eventuali_parametri>) -> tipo_risultato:
# corpo della funzione

Il tipo void

Quando NON si dichiara un tipo da restituire in realtà viene restituito un tipo Variant con valore null. A partire da Godot 4 è conveniente impostare il tipo di ritorno void, anche per le funzioni che non restituiscono valori. Dal punto di vista tecnico, il tipo di ritorno void non è un tipo di dato memorizzabile, cioè NON si possono creare variabili di tipo void. In una funzione -> void comunica al compilatore che la funzione non restituisce tipi utilizzabili.

Sebbene una funzione senza tipo dichiarato ed una con -> void possano sembrare simili, ci sono delle differenze: una funzione che ritorna -> void serve a modiifcare uno stato interno, per esempio a produrre una stampa, non ci si aspetta un risultato da assegnare ad una variabile (se si prova ad assegnare una funzione void al valore di una variabile, il compilatore segnala un errore). A partire da Godot 4 le funzioni tipizzate sono più efficienti, perché il motore non deve "indovinare" (inferire) il tipo del risultato che verrà prodotto dal blocco di codice della funzione, quindi conviene esplicitare un tipo di ritorno void piuttosto che non indicarlo nella definizione della funzione.

La distinzione da fare tra null e void è che:

  • null è un valore, indica che una variabile (che potrebbe contenere qualcosa, come un oggetto o una stringa) al momento è vuota;
  • invece void è una condizione di ritorno, indica che non esiste un valore da ricevere.

La parola chiave return

La parola chiave return interrompe l'esecuzione di una funzione e invia un valore al "chiamante". È il ponte tra ciò che succede dentro la funzione e il resto del gioco: la funzione calcola qualcosa e lo ritorna (cioè lo fornisce) a un'altra parte del codice affinché possa essere usato. Dopo che un return è stato eseguito, l'esecuzione della funzione termina immediatamente, l'eventuale codice scritto dopo non verrà eseguito.

Una funzione che non ha un tipo di ritorno dichiarato, restituisce un tipo Variant con valore null perché GDScript aggiunge un (invisibile) return null alla fine del corpo della funzione.

Una funzione void non restituisce un valore, si può usare il return da solo per uscire dal corpo della funzione in caso serva.

ESEMPIO 1: la funzione _ready() invoca tre funzioni:

  1. hellow() che stampa la stringa "Hello World", non ha tipo assegnato e quindi ritorna un tipo Variant con valore null che viene asegnato ad una variabile a (il valore di a viene stampato).
  2. stampaEco(a) dove il parametro a non ha un tipo dichiarato (quindi la funzione accetta in input qualunque cosa, come stringhe o numeri decimali); la funzione ha tipo di ritorno void che non può essere assegnato a nessuna variabile.
  3. stampaMaiuscolo(str: Stringa) dove il parametro str deve essere (per forza) di tipo stringa (viene stampata la stringa in input e la sua conversione in maiuscolo).
Funzioni semplici

OUTPUT dell'esecuzione (estendi l'area di testo se necessario):


ESEMPIO 2: classificazione di un triangolo avente per lati dei numeri interi (versione semplificata: geometricamente è incompleto in quanto non fa controlli sull'input, nel senso che non verifica se gli input siano accettabili come misure dei lati di un triangolo). Un triangolo isocele ha una solo coppia di lati uguali, un triangolo equilatero ha 3 coppie di lati uguali, un triangolo scaleno ha 0 coppie di lati uguali. Con una sola coppia di lati uguali viene eseguito il return che corrispone a "Isoscele" (il codice successivo viene ignorato e la funzione termina); se le coppie di lati uguali sono 3 viene eseguito il return che corrisponde a "Equilatero" (il resto del codice viene ignorato e la funzione termina); se non si verifica nessuna delle 2 condizioni precedenti il triangolo è per forza scaleno (viene eseguita l'ultima istruzione con il return che corrisponde a "Scaleno").

Funzione con valore di ritorno

OUTPUT dell'esecuzione (estendi l'area di testo se necessario):


Parametri delle funzioni

Una funzione può avere zero o più parametri; una funzione senza parametri fa sempre la stessa cosa. Una funzione con parametri esegue calcoli in base ai valori forniti in ingresso; l'ordine con cui vengono forniti i valori da associare ai parametri è fondamentale per eseguire un calcolo corretto. I parametri possono avere un tipo (consigliato) oppure non averlo: ai parametri senza tipo viene assegnato il tipo Variant che può contenere qualsiasi cosa.

I parametri contenuti nell'intestazione della funzione si chiamano parametri formali, cioè la funzione si riferisce ad essi nel suo corpo con il nome definito nell'intestazione, e si comportano come se fossero variabili visibili internamente al codice della funzione. I valori "veri" passati alla funzione si chiamano parametri attuali, e sono i valori con cui viene effettivamente eseguito il calcolo. La visibilità dei parametri della funzione si esaurisce alla fine del corpo della funzione.

ESEMPIO: la funzione calc() ha 3 parametri formali a, b, c, che sono i nomi delle variabili con cui sono visibili all'interno della funzione; non hanno alcuna relazione con le variabili a, b, c definite nella funzione _ready().

Parametri formali e attuali

OUTPUT dell'esecuzione (estendi l'area di testo se necessario):

La chiamata calc(a, b, c) della funzione _ready() equivale a calc(20, 10, 5) cioè il valore dei parametri attuali di calc() è a=20, b=10, c=5; calc() restituisce (return) il valore 20*5-10*5=50.

Invece, la chiamata calc(b, a, c) di _ready() equivale a calc(10, 20, 5); il valore dei parametri attuali di calc() in questo caso è a=10, b=20, c=5; calc() restituisce il valore 10*5-20*5=-50.

Parametri opzionali

In GDScript, i parametri opzionali (o argomenti di default) permettono di chiamare la stessa funzione con un numero diverso di argomenti, assegnando dei valori predefiniti a quelli che si decide di omettere. Per rendere un parametro opzionale, basta assegnargli un valore direttamente nella dichiarazione della funzione usando l'operatore =. I parametri a cui non si assegna un valore predefinito sono obbligatori.

C'è un'unica regola: nell'intestazione della funzione, i parametri opzionali devono sempre seguire i parametri obbligatori (non si può avere un parametro obbligatorio dopo uno opzionale altrimenti si ha un errore in compilazione).

ESEMPIO: la seguente funzione moltiplica() ha il primo parametro (a) obbligatorio, il secondo (m) è opzionale con valore predefinito 1.0; la funzione ritorna il risultato della moltiplicazione a*m, se m non è fornito assume valore 1.0 (quindi a viene moltiplicato per 1.0 e la funzione ritorna a).

Parametri opzionali

OUTPUT dell'esecuzione (estendi l'area di testo se necessario):

ESEMPIO: errore in compilazione perché i paramtri opzionali devon essere gli ultimi nell'intestazione della funzione.

Errore in compilazione a causa dell'ordine

I parametri opzionali possono essere più di uno, l'importante è che siano tutti definiti alla fine dell'intestazione della funzione. I parametri eventualmente omessi nella chiamata della funzione sono considerati automaticamente gli ultimi contenuti nell'intestazione.

ESEMPIO 1: la seguente versione della funzione moltiplica() ha entrambi i parametri opzionali, con valore predefinito 1.0; la funzione ritorna il risultato della moltiplicazione a*m. Se ne viene omesso uno, è automaticamente considerato omesso l'ultimo (m) che assume il valore 1.0 (quindi a viene moltiplicato per 1.0 e la funzione ritorna a). Se vengono entrambi omessi anche il primo parametro assume il valore 1.0 e la funzione ritorna come risultato 1.0.

Solo parametri opzionali

OUTPUT dell'esecuzione (estendi l'area di testo se necessario):

ESEMPIO 2: la seguente versione della funzione moltiplica() ha un parametro obbligatorio (a) e due parametri opzionali (m ed s), con valore predefinito m=1 e s=0. Se tutti e 3 i parametri sono presenti la funzione ritorna a*m+s. Se ne viene omesso uno, viene automaticamente considerato omesso l'ultimo (s) che assume il valore 0 (quindi la funzione ritorna a*m). Se vengono omessi entrambi i parametri opzionali, allora automaticamente m=1 e s=0 e la funzione ritorna a.

OUTPUT dell'esecuzione (estendi l'area di testo se necessario):

Moltiplica e somma con parametri opzionali

OUTPUT dell'esecuzione (estendi l'area di testo se necessario):


Funzioni con numero variabile di parametri

A partire da Godot 4.5, GDSrcipts supporta funzioni con un numero variabile di parametri (in altri linguaggi di programmazione si chiamano varargs). Per definire una funzione con un numero variabile di parametri si usa il rest parameter (parametro resto), che consiste in tre punti seguito dal nome formale della lista di parametri, per esempio ...args. Una funzione può avere un solo rest parameter e deve essere l'ultimo nella lista dei parametri, inoltre il rest parameter non può avere valori predefiniti.

La sintassi è la seguente:

func nome_fun(<altri_param>, ...args) -> tipo_risultato:
# corpo della funzione

Il rest parameter ...args può contenere qualunque numero di parametri, ogni parametro può avere un proprio tipo (casi limite: tutti tipi diversi oppure tutti tipi uguali). Internamente il rest parameter viene trattato come se fosse un array: ciò significa che se si vuole scandirlo (per esempio con un ciclo for) per eseguire dei calcoli, è necessario identificare con precisione la natura del parametro in esame (di che tipo è, che valore ha).

Viceversa, il rest parameter non può essere tipizzato (nell'intestazione della funzione non si può imporre che i parametri che lo compongono siano tutti dello stesso tipo), cioè NON si può scrivere qualcosa come
nome_funz(...args: un_certo_tipo) # ERRORE: NON COMPILA

ESEMPIO 1: la seguente funzione esegue la stampa dei paramtri che le sono passati. Ha un parametro obbligatorio (s) di tipo stringa, e un rest parameter. Il rest parameter è trattato come array dove gli elementi sono i singoli parametri passati alla funzione (il float 3.14, l'array [1, 2] ed il dizionario { "Nome": "Mela" }).

Stampa del rest parameter

OUTPUT dell'esecuzione (estendi l'area di testo se necessario):

ESEMPIO 2: la seguente funzione esegue la somma di una serie di numeri interi o decimali.

Somma con rest parameter

OUTPUT dell'esecuzione (estendi l'area di testo se necessario):


Funzioni stub

Una funzione stub è una funzione che è stata dichiarata, ma che non contiene ancora la logica reale o il codice definitivo. Si usa spesso durante la fase di sviluppo per evitare errori di compilazione o per pianificare l'architettura di uno script senza dover scrivere immediatamente ogni singolo dettaglio. 

Nelle funzioni stub di tipo void in genere si usa la parola chiave pass seguita da un commento che aiuti a ricordare che il codice deve essere realizzato; si usa pass poiché essendo GDSCript basato sull'indentazione, non si può lasciare una funzione "vuota", ossia senza nessuna istruzione, dopo i due punti : che ne terminano l'intestazione.

ESEMPIO 1: funzione stub di tipo void

Funzione stub void

Nelle funzioni stub che devono restituire un valore si consiglia di inserire un valore convenzionale "neutro", ossia che non faccia nulla ma che permetta alla funzione di essere eseguita a scopo di test.

ESEMPIO 2: funzione stub con valore di ritorno convenzionale. Il danno inflitto ad un nemico potrebbe essere calcolato come valore intero maggiore o uguale a 0: maggiore di 0 infligge un danno, 0 non infligge danno e si può considerare un valore "neutro" (mima il pass delle funzioni void).

Funzione stub int

Per ulteriori informazioni sulle funzioni consultare la documentazione ufficiale: https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html#functions


Precedente Indice Successivo