Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 17 di 45
  • livello principiante
Indice lezioni

If e unless

I primi costrutti per eseguire le istruzioni condizionali in Ruby: if e unless
I primi costrutti per eseguire le istruzioni condizionali in Ruby: if e unless
Link copiato negli appunti

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

Ti consigliamo anche