If
Iniziamo dando uno sguardo a if
. Sorvoliamo sul significato di questo costrutto, noto a chiunque conosca l'abc della programmazione, e passiamo direttamente alla sintassi con un esempio:
if n == 1 then puts "N vale uno" elsif n == 2 then puts "N vale due" else puts "N non vale ne uno ne due" end
È possibile omettere, qualora non necessario, sia il ramo elseif
sia il ramo else
e arrivare alla forma base
if espressione then istruzione end
è anche possibile sostituire alla parola chiave then
i due punti (:
), o anche ometterla del tutto se il nostro if
è scritto su più linee. L'esempio di prima diventa dunque:
if n == 1 puts "N vale uno" elsif n == 2 puts "N vale due" else puts "N non vale ne uno ne due" end
Possiamo inserire un'espressione if anche in coda ad una normale istruzione
puts "N è maggiore di dieci" if n > 10
Unless
Opposto all'if
abbiamo lo statement unless
che esegue le istruzioni associate all'espressione che risulta falsa:
unless n > 10 puts "N non è maggiore dieci" else puts "N è maggiore di dieci" end
Anche dell'unless
ne esiste una versione modificatrice di istruzione:
puts "N è maggiore di dieci" unless n < 10
Una forma ancora più ermetica prevede l'uso dell'operatore ?
nel seguente modo:
segno = n >= 0 ? "positivo" : "negativo"
se la condizione è vera viene eseguita la prima espressione, se è falsa la seconda. È buona norma usare questa sintassi solo nei casi in cui non va a scapito della leggibilità, uno dei punti di forza del Ruby.
Infine come esercizio riscriviamo il metodo rifornimento dell'esempio che abbiamo scritto in precedenza tenendo contro della capacità massima del serbatoio. Innanzitutto bisogna creare una variabile per la capacità massima, e poi non ci resta che controllare se la quantità di carburante che vogliamo immettere più quella già presente nel serbatoio non sia superiore alla capacità stessa. In caso affermativo eroghiamo solo la quantità di carburante necessaria per un pieno.
Scrivendo il tutto in modo didattico otteniamo il codice seguente:
CAPACITA_MAX_SERBATOIO = 100 def rifornimento (quantita) if (@carburante + quantita) > CAPACITA_MAX_SERBATOIO then quantita_necessaria = CAPACITA_MAX_SERBATOIO - @carburante @carburante += quantita_necessaria puts "Carburante erogato: #{quantita_necessaria}" else @carburante += quantita puts "Carburante erogato: #{quantita}" end puts "Carburante totale: #{@carburante}" end
Eliminando le variabili ridondanti e le ripetizioni arriviamo ad un risultato sicuramente migliore:
def rifornimento (quantita) if (@carburante + quantita) > CAPACITA_MAX_SERBATOIO then quantita = CAPACITA_MAX_SERBATOIO - @carburante end @carburante += quantita puts "Carburante erogato: #{quantita}" puts "Carburante totale: #{carburante}" end
Fatto questo possiamo scrivere:
c = Camion.new(50, 30) c.rifornimento(90)
ed otteniamo in output il giusto risultato:
Carburante erogato: 70 Carburante totale: 100
In alternativa avremmo potuto scrivere in modo più conciso, su una unica riga, anche in questo modo:
def rifornimento (quantita) quantita = (@carburante + quantita) > CAPACITA_MAX_SERBATOIO ? CAPACITA_MAX_SERBATOIO - @carburante : quantita @carburante += quantita puts "Carburante erogato: #{quantita}" puts "Carburante totale: #{carburante}" end