Nella maggior parte linguaggi informatici, il caso o il condizionale (noto anche come interruttore) confronta il valore di una variabile con quello di più costanti o letterali ed esegue il primo percorso con un caso corrispondente. Nel Rubino, è un po 'più flessibile (e potente).
Invece di eseguire un semplice test di uguaglianza, viene utilizzato l'operatore di uguaglianza caso, aprendo la porta a molti nuovi usi.
Ci sono alcune differenze rispetto ad altre lingue. Nel C, un'istruzione switch è un tipo di sostituzione per una serie di if and goto dichiarazioni. I casi sono tecnicamente etichette e il istruzione switch andrà all'etichetta corrispondente. Questo mostra un comportamento chiamato "fallthrough", poiché l'esecuzione non si ferma quando raggiunge un'altra etichetta.
Questo di solito viene evitato usando un'istruzione break, ma il fallthrough è talvolta intenzionale. L'affermazione del caso in Ruby, d'altra parte, può essere vista come una scorciatoia per una serie di Se dichiarazioni. Non c'è fallthrough, verrà eseguito solo il primo caso corrispondente.
La forma base di una dichiarazione di caso
La forma di base di un'istruzione case è la seguente.
Come puoi vedere, questo è strutturato in modo simile a un'istruzione condizionale if / else if / else. Il nome (che chiameremo il valore), in questo caso immesso dalla tastiera, viene confrontato con ciascuno dei casi dal quando clausole (ad es. casi) e verrà eseguito il primo blocco quando con un caso corrispondente. Se nessuno di questi corrisponde, il altro il blocco verrà eseguito.
La cosa interessante qui è Come il valore viene confrontato con ciascuno dei casi. Come menzionato sopra, in C ++e altri linguaggi simili a C, viene utilizzato un semplice confronto di valori. In Ruby viene utilizzato l'operatore caso uguaglianza.
Ricorda che il tipo del lato sinistro di un operatore di uguaglianza di casi è importante e i casi sono sempre di lato sinistro. Quindi, per ciascuno quando clausola, valuterà Ruby valore del caso fino a quando non trova una corrispondenza.
Se dovessimo inserire peso, Ruby avrebbe prima valutato "Alice" "Bob", che sarebbe falso da allora Corda# è definito come il confronto delle stringhe. Il prossimo, /[qrz[.+/i "Bob" verrebbe eseguito, il che è falso da allora peso non inizia con Q, R o Z.
Poiché nessuno dei casi corrisponde, Ruby eseguirà quindi la clausola else.
Come entra in gioco il tipo
Un uso comune dell'istruzione case è determinare il tipo di valore e fare qualcosa di diverso a seconda del tipo. Anche se questo rompe la consueta battuta di anatra di Ruby, a volte è necessario fare le cose.
Funziona usando il Classe# (tecnicamente, il Modulo#) operatore, che verifica se il lato destro è un? lato sinistro.
La sintassi è semplice ed elegante:
Un'altra forma possibile
Se la valore viene omesso, l'istruzione case funziona in modo leggermente diverso: funziona quasi esattamente come un'istruzione if / else if / else. I vantaggi dell'utilizzo dell'istruzione case rispetto a unSe dichiarazione, in questo caso, sono puramente cosmetici.
Una sintassi più compatta
Ci sono momenti in cui ci sono molti piccoli quando clausole. Tale affermazione di un caso diventa facilmente troppo grande per adattarsi allo schermo. In questo caso (nessun gioco di parole previsto), è possibile utilizzare il poi parola chiave per inserire il corpo del file quando clausola sulla stessa riga.
Mentre questo rende un codice molto denso, purché ciascuno quando la clausola è molto simile, in realtà diventa Di Più leggibile.
Quando dovresti usare la linea singola e multilinea quando le clausole dipendono da te, è una questione di stile. Tuttavia, non è consigliabile mescolare i due: un'istruzione case dovrebbe seguire uno schema per essere il più leggibile possibile.
Assegnazione del caso
Come per le dichiarazioni if, le dichiarazioni case valutano l'ultima istruzione nel file quando clausola. In altre parole, possono essere utilizzati nelle assegnazioni per fornire una sorta di tabella. Tuttavia, non dimenticare che le dichiarazioni dei casi sono molto più potenti delle semplici ricerche di array o hash. Una tabella del genere non ha necessariamente bisogno di usare letterali in quando clausole.
Se non vi è corrispondenza tra la clausola when e la clausola else, allora verrà valutata l'istruzione case zero.