I molti usi di Ruby Case State

Quando avete bisogno di usare delle if / elsif dichiarazioni, potreste invece considerare l’uso di una dichiarazione Ruby case. In questo post, imparerete alcuni casi d’uso diversi e come funziona veramente tutto sotto il cofano.

ruby case

Nota: In altri linguaggi di programmazione questo è noto come istruzione switch.

I componenti di una dichiarazione di caso in Ruby:

Parola chiave Descrizione
case Inizia una definizione di caso. Prende la variabile con cui si sta per lavorare.
when Ogni condizione che può essere abbinata è una dichiarazione when.
else Se niente corrisponde allora fate questo. Opzionale.

Ruby Case & Ranges

La dichiarazione case è più flessibile di quanto possa sembrare a prima vista. Vediamo un esempio in cui vogliamo stampare qualche messaggio a seconda dell’intervallo in cui cade un valore.

case capacitywhen 0 "You ran out of gas."when 1..20 "The tank is almost empty. Quickly, find a gas station!"when 21..70 "You should be ok for now."when 71..100 "The tank is almost full."else "Error: capacity has an invalid value (#{capacity})"end

Credo che questo codice sia abbastanza elegante rispetto a quello che sarebbe la versione if / elsif.

Caso Ruby & Regex

Puoi anche usare espressioni regolari come condizione when. Nel seguente esempio abbiamo un serial_code con una lettera iniziale che ci dice quanto sia rischioso consumare questo prodotto.

case serial_codewhen /\AC/ "Low risk"when /\AL/ "Medium risk"when /\AX/ "High risk"else "Unknown risk"end

Quando non usare Ruby Case

Quando si ha una semplice mappatura 1:1, si potrebbe essere tentati di fare qualcosa del genere.

case countrywhen "europe" "http://eu.example.com"when "america" "http://us.example.com"end

Secondo me sarebbe meglio fare così invece:

SITES = { "europe" => "http://eu.example.com", "america" => "http://us.example.com"}SITES

La soluzione hash è più efficiente e facile da usare. Non credi?

Come funziona il caso: il metodo ===

Ti starai chiedendo come funziona case sotto il cofano. Se torniamo al nostro primo esempio, ecco cosa succede:

(1..20) === capacity(21..70) === capacity(71..100) === capacity

Come potete vedere, la condizione è invertita perché Ruby chiama === sull’oggetto a sinistra. Il === è solo un metodo che può essere implementato da qualsiasi classe. In questo caso, Range implementa questo metodo restituendo true solo se il valore si trova all’interno dell’intervallo.

Ecco come === è implementato in Rubinius (per la classe Range):

def ===(value) include?(value)end

Source: https://github.com/rubinius/rubinius/blob/master/core/range.rb#L178

Procs + Case

Un’altra classe interessante che implementa === è la classe Proc.

Post correlati: Per saperne di più sui procs & lambda.

In questo esempio definisco due procs, uno per controllare un even numero, e un altro per odd.

odd = proc(&:odd?)even = proc(&:even?)case numberwhen odd puts "Odd number"when even puts "Even number"end

Questo è ciò che accade realmente:

odd.===(number)even.===(number)

Utilizzare === su un proc ha lo stesso effetto che utilizzare call.

Conclusione

Hai imparato come funziona l’istruzione del caso in Ruby e quanto può essere flessibile. Ora tocca a voi iniziare ad usarlo al meglio nei vostri progetti.

Spero che abbiate trovato utile questo articolo!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *