Ruby – istruzioni di scelta: if, unless, case e ?:

r7

if

L’istruzione if è eseguita se la condizione ad essa collegata è vera.

print "Dammi un numero: "
num = gets.to_i
puts "#{num}: pari"    if num % 2 == 0
puts "#{num}: dispari" if num % 2 == 1 

c0

Parecchie cose nuove in 4 righe di script! Intanto to_i converte la stringa restituita da gets in intero. Seguono due test sul numero: se il resto della divisione per 2 (ottenuto con l’operatore % –modulo) è 0 il numero è pari e la puts della riga 3 viene eseguita; se invece il resto è 1 allora la puts della quarta riga sarà eseguita.

Notare l’ordine invertito delle istruzioni, almeno così penseranno subito coloro che conoscono un linguaggio di programmazione diverso da Ruby (stavo per dire normale, cioè non super).

Però per loro si può fare anche così:

print "Dammi un numero: "
num = gets.to_i
if num % 2 == 0
    puts "#{num}: pari"
end

if num % 2 == 1
    puts "#{num}: dispari"
end

c1

Ve l’ho già detto che Ruby è super, vero?

Notare che il rientro (di solito viene chiamato indentazione à la ‘mericana) è solo per leggibilità.

Ma questo script è da niubbo: fa due volte lo stesso test, antieconomico e fonte di errori in una successiva fase di modifica. Si può fare di meglio come vedremo immediatamente.

if – else

modifichiamo l’ultimo script, così:

print "Dammi un numero: "
num = gets.to_i
if num % 2 == 0
    puts "#{num}: pari"
else
    puts "#{num}: dispari"
end

c2

OK, otteniamo gli stessi risultati di prima, qual è il vantaggio? È grandissimo: il test viene fatto una volta sola (riga 3) e se superato viene eseguita la parte dopo l’if; viene invece eseguita quella relativa a else se la condizione non è verificata. Questa versione è molto più mantenibile (sempre che si dica così fare la manutenzione).

Ma si può fare ancora di più, ecco…

elsif

a,b,c = 3,7,5
if a >= b and a >= c
    puts "a = #{a} is greatest"
elsif b >= c and b >= a
    puts "b = #{b} is greatest"
else
    puts "c = #{c} is greatest"
end

c3

Nella prima riga c’è un’assegnazione multipla, poteva naturalmente essere estesa in questa tripletta:

a = 3
b = 7
c = 5

Notare altresì and, parola chiave che vediamo per la prima volta. Altra particolarità di Ruby: elsif si scrive davvero così (quasi peggio di Python dove si usa elif). Cosa non si fa per risparmiare un carattere!
Di condizioni elsif ne possiamo mettere tante quante ne servono. Infine prima dell’end che chiude l’if possiamo mettere l’else che verrà eseguita se nessuna delle precedenti condizioni risulta soddisfatta. Ovviamente l’else non è obbligatorio.

unless

Ruby ha una condizione che non trovate normalmente: unless che si può tradurre “a meno che” o “tranne che”:

print "Enter your age: "
age = gets.to_i
unless age >= 18
    puts "You are a minor"
else
    puts "You are a grown up"
end

c4

unless è ridondante: la condizione della riga 3 poteva essere scritta: if age < 18. OK, c’è se si vuole si può usare (anche se…).

case

Alle volte dobbiamo scegliere tra parecchie alternative; si potrebbe usare if con diversi elsif ma esiste un modo migliore:

print "Dammi un numero (1..5): "
num = gets.to_i
parola = String.new

case num
    when 1
        parola = "uno"
    when 2
        parola = "due"
    when 3
        parola = "tre"
    when 4
        parola = "quattro"
    when 5
        parola = "cinque"
    else
        parola = nil
end

puts "hai scritto " + parola if parola

c5

OK, case e when dovrebbero risultare chiari, vero?

Notare il solito else (ultima condizione, facoltativo) alla riga 16.
La variabile parola viene inizializzata vuota con l’operatore new, riga 3. Potrà così essere utilizzata all’interno del case. Naturalmente avrei potuto scrivere anche parola = "" o parola = nil o omettere del tutto la riga ma in quest’ultimo caso bisogna essere sicuri che alla fine la variabile abbia un valore per l’if di riga 20.
nil l’abbiamo già incontrata precedentemente, ricordate?

?:

In Ruby non poteva mancare l’operatore ternario, introdotto inizialmente nel C e successivamente dappertutto perché fa figo.

print "Dammi un numero: "
num = gets.to_i
num % 2 == 0 ? (puts "pari") : (puts "dispari")

c6

Sì capita, bisogna sempre fare attenzione 😦 ?: è da usare solo per cose molto semplici (e sicure).

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • bakerstreetboy  Il 27 maggio 2013 alle 11:41

    Post interessante e succoso, torno più tardi per commentarlo.. intanto ci sono!

  • bakerstreetboy  Il 27 maggio 2013 alle 19:42

    Sono tornato solo adesso, ma ho un regalino per scusarmi. Te lo invio in mail, ne parliamo sempre in mail.

    Ciao!

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: