|
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:
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 |