Nella maggior parte dei 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. In Ruby, è 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. In C, un'istruzione switch è un tipo di sostituzione per una serie di if and goto dichiarazioni. I casi sono tecnicamente etichette e l'istruzione switch passerà 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 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 (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 accennato in precedenza, in C ++ e in 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 case === valore fino a quando non trova una corrispondenza.
Se dovessimo inserire peso, Ruby avrebbe prima valutato "Alice" === "Bob", che sarebbe falso da allora String # === è 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.
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 Class # === (tecnicamente, il Modulo # ===) operatore, che verifica se il lato destro è un? lato sinistro.
La sintassi è semplice ed elegante:
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 un Se dichiarazione, in questo caso, sono puramente cosmetici.
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.
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.