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