Ruby – range

ruby logo

Oggi un’altra parola difficile: Range. Sì lo so che si potrebbe tradurre con intervallo o estensione o qualcosa di simile ma non è la stessa cosa. E poi negli script dobbiamo scriverla così e allora tanto vale 😉

Vediamo con un esempio pratico cosa sono:

r0

ecco (1..5), (4..8) e ("bad".."bag") sono range, cioè un oggetto che ha tutti i valori compresi tra un minimo e un massimo. E funzionano non solo con i numeri ma anche con le stringhe.

r1

ecco come definire un range, determinare la sua classe, trovare i valori massimo e minimo e l’array corrispondente. Notare che a resta un Range e per salvare l’array dobbiamo usare una variabile, così:

r2

Vediamo un esempio di uso dei range:

#!/usr/bin/ruby
#uso di range: peso.rb

puts "Valutazione del peso"
print "Quanto pesi: "
peso = gets.chop.to_i

giudizio = case peso
    when  30..50
        'magro, mangia!'
    when  51..75
        "OK, t'invidio!"
    when  76..100
        'considera una dieta...'
    when 101..150
        'ciccione! a dieta subito!'
    else
        "eh!?"
end

puts "Giudizio del dietologo: #{giudizio}" 

peso

Nota: prima della versione 1.9 la sintassi di case/when era diversa, le varie condizioni dovevano essere espresse così: when 51..75 : "OK, t'invidio!". (Matz, pastissun!).

Da notare inoltre la riga 6: gets prende la risposta, chop toglie l’a-capo e to_i la converte in numero (intero). I metodi vengono applicati in cascata.

Un altro caso in cui i range tornano utili è quello di verificare se si è in un intervallo, p.es.:

#!/usr/bin/ruby
#min-mai.rb minuscole/maiuscole

print "Scirvi una lettera: "
lettera = gets.chop

puts "Hai premuto una lettera minuscola" if ('a'..'z') === lettera
puts "Hai premuto una lettera Maiuscola" if ('A'..'Z') === lettera
if not (('a'..'z') === lettera or ('A'..'Z') === lettera) then
    puts "Non e' una lettera"
end

min-mai

OK? Notare la condizione composta (righe 9-11) con la sintassi alternativa dell’if. Solo perché altrimenti la riga diventava troppo lunga 😉

Importante invece l’uso di === (invece del solito ==). Qui il discorso diventerebbe lungo, fate un salto qui: What’s the difference between equal?, eql?, ===, and ==?.

Regola pratica: usare di solito == tranne nei casi di:

  • Range;
  • Regex (espressioni regolari, roba da Perl);
  • Proc (funzioni, dalla v. 1.9).

C’è poi un ultima cosa sui Range: i tripli punti. La ragione c’è, un po’ arcana, adesso non interessa, ma:

tp

chi è che ha detto Python?
Bravo! 😀
Sì anche C! 😀

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • dikiyvolk  Il 25 giugno 2013 alle 11:30

    Ciao Juhan,

    Quella del === non la sapevo e neanche dei … sei una vera fonte di chicche interessanti. Volevo usare “pozzo senza fondo” ma non era previsto nel case di peso.rb 🙂

    • juhan  Il 25 giugno 2013 alle 11:33

      E pensa te che questo è un corso introduttivo! Per principianti.
      Ho visto che Ruby va forte tra i lispisti (clojuristi mi sembra una di quelle cose che non si possono dire in fascia protetta). Io resto (ancora, almeno adesso) pythonista, tendenzialmente.

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: