1 | 2 | 3 | 4

Ruby in Venti Minuti

Guardiamo con un po’ più di attenzione il nostro nuovo programma. Fate attenzione a (#). In Ruby, qualsiasi linea preceduta da questo carattere viene ignorata dall’interprete dei comandi. La prima linea del nostro file è speciale, ovvero nei sistemi tipo Unix dice alla shell come avviare il file. Il resto dei commenti invece serve come spiegazione.

Il nostro metodo saluta è diventato un pochino più complicato.

# Saluta tutti
def saluta
  if @nomi.nil?
    puts "..."
  elsif @nomi.respond_to?("each")
    # @nomi è una lista di qualche tipo, allora iteriamo!
    @nomi.each do |nome|
      puts "Ciao #{nome}!"
    end
  else
    puts "Ciao #{@nomi}!"
  end
end

Ora controlla la variabile di istanza @nomi per prendere una decisione. Se è nil, mostra tre puntini: senza nome non possiamo salutare nessuno giusto?

Cicli e iterazione

Se l’oggetto @nomi risponde al metodo each possiamo interagire quindi saluta ogni persona. Infine se @nomi è qualcos’altro automaticamente lo convertiamo in stringa e usiamo il saluto di default.

Vediamo l’iterazione in modo più approfondito:

@nomi.each do |nome|
  puts "Ciao #{nome}!"
end

each è un metodo che accetta un bloccho di codice e lo ripete per ogni elemento nella lista, il codice tra do e end è il blocco che verrà ripetuto. Il blocco è come una funzione anonima o lambda. La variabile tra | è il parametro del blocco.

Qui, per ogni elemento della lista nome viene eseguita l’espressione puts "Ciao #{nome}!".

Molti altri linguaggi di programmazione esaminano una lista utilizzando il ciclo for, in C si ottiene qualcosa di simile:

for (i=0; i<numero_di_elementi; i++)
{
  fai_qualcosa_con(elemento[i]);
}

Funziona ma non è molto elegante. C’è bisogno di una variabile come i, capire quanto è lunga la lista e creare una funzione da ripetere. In ruby è molto più elegante. Tutti i dettagli dell’infrastruttura sono nascosti nel metodo each, quello che devi fare semplicemente dire cosa fare per ogni elemento. All’interno del metodo each essenzialmente viene chiamato yield "Fabio", poi yield "Davide" e poi yield "Raul", e così via.

I blocchi, una delle funzionalità più potenti di Ruby

La vera potenza dei blocchi si ottiene quando trattiamo qualcosa di più complicato rispetto alle liste. Al di là di semplici esempi all’interno del metodo, puoi anche gestire l’inizializzazione, la finalizzazione e gli errori. Tutti nascosti dagli occhi indiscreti degli utenti.

# Congeda tutti
def congeda
  if @nomi.nil?
    puts "..."
  elsif @nomi.respond_to?("join")
    # Unisci gli elementi della lista con delle virgole
    puts "Arrivederci #{@nomi.join(", ")}. A presto!"
  else
    puts "Arrivederci #{@nomi}. A presto!"
  end
end

Il metodo congeda non usa each, ma controlla se @nomi risponde al metodo join e in tal caso viene utilizzato. Se non risponde al metodo join il contenuto di nomi viene convertito in stringa. Questo metodo non si preoccupa del tipo della variabile, è sufficiente verificare quali metodi supporta un pò come il “Duck Typing”… “Se cammina come anatra e fa il verso dell’anatra…” Il vantaggio è quindi che non siamo limitati necessariamente ad usare i tipi di variabili supportate. Se qualcuno inventa un nuovo tipo di lista e questa lista risponde al metodo join tutto funzionerà come previsto.

Lanciare lo script

Quindi questa è la nostra classe AmicoDiTutti, il resto del file si preoccupa di chiamare i metodi di questa classe. C’è qualcos’altro che dobbiamo vedere:

if __FILE__ == $0

__FILE__ è una variabile “magica” che contiene il nome del file. $0 è il nome del file utilizzato per avviare il programma. Questo controllo dice: “Se questo è il file principale utilizzato…” Ciò permette al file di essere utilizzato come una libreria e il codice non viene eseguito in questo contesto ma se il file viene utilizzato come eseguibile allora anche il codice viene eseguito.

Ora sai qualcosa di Ruby

Questo è stato un piccolo tour di Ruby. Ci sono moltissime cose da scoprire, le diverse strutture di controllo che Ruby offre; l’uso dei blocchi e lo yield; moduli come mixins e molto altro. Spero che Ruby ti abbia invogliato a saperne di più.

Se così fosse, allora dai un occhiata alla nostra sezione Documentazione che contiene link a manuali e tutorial tutti disponibili gratuitamente online.