Home Rhyylen
Contatto
 
 
 
Crystal Language
Capitolo 8
Selezione con if e unless

Tipica istruzione di selezione if è presente in quasi tutti i lin guaggi di programmazione, tutti quelli che io conosco la prevedono. In Crystal questa istruzione non ha particolari difficoltà e suoi compgni di viaggio sono le altre due keyword else ed elsif oltre, a end che termina la selezione. In pratica si presentano le tre seguenti possibilità:

1)
if condizione booleana
  istruzioni
end

2)
if condizione booleana
  istruzioni
else
  istruzioni
end

3)
if condizione booleana
  istruzioni
elsif condizione booleana
  istruzioni
.....
else
  istruzioni
end

Ciascuna di queste possibilità esprime evidentemente una situazione diversa. Ricordatevi di andare a capo per inserire le istruzioni dopo la condizione. Vediamo gli esempi relativi in maniera progressiva:

1)
print "Inserisci un numero: "
n1 = gets()
n2 = (n1.to_s).to_i
if n2 == 0
  puts ("zero")
end

2)
print "Inserisci un numero: "
n1 = gets()
n2 = (n1.to_s).to_i
if n2 == 0
  puts "zero"
else
  puts "diverso da zero"
end

3)
print "Inserisci un numero: "
n1 = gets()
n2 = (n1.to_s).to_i
if n2 == 0
  puts "zero"
elsif n2 >0
  puts "maggiore di zero"
else
  puts "minore di zero"
end

Precisiamo subito che possiamo inserire quanti elsif vogliamo prima del else finale. Di norma è bene non esagerare per evitare di rendere difficile la lettura e la manutenzione del programma. vedremo un costrutto (case) più adatto a gestire situazioni con numerosi ramificazioni.
Il problema relativo all'inserimento di più istruzioni nei vari rami
si risolve semplicemente come segue (mi sono fermato a due ma le istruzioni possono essere n):


if condizione1
# Prima istruzione del primo branch
# Seconda istruzione del primo branch
elsif condizione2
# Prima istruzione del secondo branch
# Seconda istruzione del secondo branch
else
# Prima istruzione del branch else
# Seconda istruzione del branch else
end

Una ovvia considerazione è che viene eseguito il primo branch che vede verificata la propria condizione, gli altri sono saltati senza possibilità di esecuzione. Vengono anche evitate situazioni di fall-through

Il risultato di una selezione può essere attribuito ad una variabile come nell'esempio seguente:

   
1
2
3
4
5
6
7
8
9
print "Inserisci un numero: "
  n1 = gets()
  n2 = (n1.to_s).to_i
  s1 = if n2 % 2== 0
    "pari"
  else
    "dispari"
  end
puts s1

L'assegnazione avviene alla riga 4, come è evidente.
Questi casi si possono anche gestire con l'operatore ternario, che composto dalla coppia di operatori ? e : per distinguere i due casi (non più di due). In pratica potevamo scrivere:

s1 = (n2 % 2 == 0) ? "pari" : "dispari"

all'interno di un operatore ternario possiamo gestire più istruzioni separandole con il ;

(n2 % 2 == 0) ? (puts "pari"; puts "evviva") : (puts "dispari"; puts "ciao")

Il nostro if maniera molto elastica

x = 3 if n2 > 5

in questo caso x sarà 3 oppure nil. La forma più chiara è:

x = (n2 > 5) ? 3 : nil

Si può utilizzare anche in congiunzione con un metodo:

if n2.is_a?(Number)

Insomma, basta che abbiamo una risposta di tipo booleana

UNLESS

Unless è in parte analogo a if ma si comporta in maniera opposta, mandando in esecuzione un ramo se la condizione che lo introduce è falsa anzichè vera. Inoltre con unless non si può utilizzare la keyword elsif ma solo un ulteriore opzionale ramo else.

print "Inserisci un numero: "
n1 = gets()
n2 = n1.to_s.to_i
unless (n2 >= 0)
  puts "minore di 0"
end

questo programma stampa l'output solo se la condizione n2 >= 0 non è verificata. Vediamo un esempio più completo comprendente l'assegnazione del valore in uscita da unless ad una variabile::

x = 5
s1 = unless x > 10
  "x non è maggiore di 10"
else
  "x è maggiore di 10"
end
puts s1