Il costrutto if-elif-else controlla un serie di espressioni booleane fino a quando ne trova una verificata oppure non ne trova nessuna. Quando il numero di valori da verificare è numeroso, GDScript offre un'alternativa più elegante e leggibile rispetto a lunghe catene di if/elif/else, l'istruzione condizionale match.
Istruzione match
L'istruzione match confronta un'espressione con diversi pattern (valori singoli o multipli) ed esegue blocchi di codice specifici quando trova una corrispondenza, supportando tipi di dato semplici, array, dizionari e wildcard, una specie di jolly rappresentato dal carattere di sottolineatura _ (underscore) per supportare i casi predefiniti (in modo analogo alla clausula else).
La sintassi generale dell'istruzione è:
<pattern_n>:
La logica di funzionamento è la seguente:
- viene controllato il valore di test per cercare una corrispondenza tra quelle elencate, nello stesso ordine con cui sono state scritte (quindi dall'alto verso il basso nel codice);
- se il valore viene trovato, viene eseguito il blocco di codice corrispondente, dopodiché il codice esce dal match e continua con le sitruzioni successive;
se invece il valore non viene trovato, controlla se esiste la wildcard: se c'è vengono eseguite le istruzioni del blocco-wildcard (se la wildcard non c'è non viene eseguito nulla), e poi si continua con le istruzioni successive al match.
NOTA BENE 1: l'uso del carattere wildcard _ è facoltativo, è consigliato usarlo nei casi dove potrebbe esistere un valore non elencato tra le varie possibilità da controllare. Di fatto, la wildcard corrisponde a qualsiasi cosa e per questo motivo, quando inserita, deve essere inserita come ultima alternativa del match.
NOTA BENE 2: l'istruzione match è molto simile all'istruzione switch-case di linguaggi di programmazione come C/C++, C# e Java. A differenza di questi, non si richiede di inserire esplicitamente un'istruzione break per uscire dal blocco di codice eseguito (vengono eseguite in modo automatico SOLO le istruzioni della corrispondenza trovata).
ESEMPIO 1 (match con valori predefiniti). Stampare la classe di un personaggio in base al valore del carattere definito dalla variabile classe (se la variabile contiene valori diversi da A, B, G, P, S non viene stampato nulla perché la wildcard non è definita):
OUTPUT dell'esecuzione (estendi l'area di testo se necessario):
ESEMPIO 2 (match con valori multipli per il pattern). Controllare se un certo valore ricade nei valori definiti oppure no (lo 0 per semplicità è considerato "positivo" anche se matematicamente non lo è). Se la variabile valore contiene un numero intero negativo, oppure positivo ma maggiore o uguale a 10, viene eseguito il codice associato alla wildcard (_), che stampa il messaggio "Fuori dall'intervallo di controllo":
OUTPUT dell'esecuzione (estendi l'area di testo se necessario):
L'istruzione match è particolarmente utile per trovare valori in strutture dati più sofisticate rispetto a singoli valori di variabile (array, dizionari, intervalli, liste di valori) ed intraprendre le azioni opporune.
Per ulteriori informazioni su match riferirsi alla documentazione ufficiale: https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html#match
L'istruzione "vuota" pass
In GDScript l'istruzione pass è un'istruzione nulla ossia, quando viene eseguita, non esegue alcuna operazione. Esiste perché GDScript utilizza l'indentazione per definire i blocchi di codice (come Python) ma non è possibile lasciare un blocco (in una istruzione o in una funzione) completamente vuoto senza causare un errore durante la fase di analisi del codice; pass in pratica funge da segnaposto (placeholder) sintattico per evitare che l'editor segnali errori. Quando incontra l'istruzione pass, il codice semplicemente va avanti (non interrompe il flusso di esecuzione, non cambia lo stato del programma, non restituisce valori), è solo un modo per dire al compilatore "qui non c'è ancora nulla, vai avanti".
Nello sviluppo quotidiano con Godot, l'istruzione pass è essenziale perché il motore non accetta blocchi di codice vuoti dopo i due punti (:). Un esempio classico in cui l'uso di pass torna utile sono istruzioni match o if incomplete quando si ha una (o più di una) condizione verificata ma si vuole che venga (momentaneamente) ignorata senza eseguire nulla, mantenendo però la leggibilità del controllo logico.
ESEMPIO (pass in un match con valori per cui non si è ancora deciso cosa fare): viene trovata la corrispondenza con il valore 6, ma il blocco di codice corrispondente è pass, che viene eseguito (non facendo niente); essendo stato trovato il valore 6, si esce dal match senza fare nulla.

OUTPUT dell'esecuzione (estendi l'area di testo se necessario):
La presenza di pass indica al programmatore che il codice in quel punto non è stato ancora definito o completato. Altri casi specifici (la lista non è esaustiva) in cui pass torna utile sono:
- stubbing: si progetta la struttura di una classe complessa (per es. un'intelligenza artificiale o una macchina a stati) e si vogliono definire tutti i metodi (funzioni) necessari senza doverli implementare subito (una funzione vuota, cioè che non fa nulla si chiama stub). In questo modo, il codice compila e si possono testare altre parti del gioco;
- gestione di segnali "vuoti": si collega un segnale a una funzione tramite l'editor (per esempio l'evento il segnale per la pressione di un tasto) ma non è stata ancora decisa quale azione si debba associare. Senza pass, il gioco andrebbe in errore all'avvio;
- override di metodi virtuali: quando si eredita da una classe ed occorre fare l'override di un metodo integrato di Godot (come _ready() o _process()) ma, per un test momentaneo o una specifica logica di design, vogliamo che quel metodo non faccia nulla nella sottoclasse.
L'operatore di appartenenza in
In GDScript in è un operatore di appartenenza (membership operator) che serve a verificare se un elemento appartiene a una collezione o ad una struttura dati, restituendo true ooppure false a seconda che l’elemento sia presente oppure no.
L'operatore in è classificato tecnicamente come un operatore di confronto (o relazionale); la sua funzione principale è il "test di contenuto", determinando se un operando (a sinistra) è contenuto all'interno di un altro (a destra). Ha lo stesso livello di precedenza di altri operatori di confronto (come ==, !=, <, >). Viene valutato dopo le operazioni aritmetiche (come +, *) ma prima degli operatori logici (come and o or).
Oltre a essere un operatore di confronto, in è anche una parola chiave sintattica fondamentale nei cicli.
Le strutture supportate da in includono:
- stringhe (String, controlla le sottostringhe);
- intervalli di valori (per eseguire iterazioni nei cicli for);
- array (verifica l'esistenza di elementi)
- dizionari (Dictionary, verifica l'esistenza di chiavi);
ESEMPIO (uso di in per la ricerca di sottostringhe in una stringa)
OUTPUT dell'esecuzione (estendi l'area di testo se necessario):