Sintassi alternative in Ruby
Un dei grandi vantaggi di un linguaggio semplice e potente come Ruby sta nella possibilità di ottenere uno stesso risultato in modi differenti, sfruttando cioè diversi costrutti sintattici per stampare il medesimo output o per generare comportamenti equivalenti.
In questa breve articolo presenteremo un semplice esempio basato sui cicli e non solo, il risultato desiderato è quello di creare un semplice programmino in grado di stampare tutti i numeri presenti all'interno di un range compreso tra "1" e "10".
Una soluzione come la seguente:
puts 1,2,3,4,5,6,7,8,9,10sembrerebbe a prima vista molto comoda, ma se il nostro range, fosse ben più ampio (mettiamo compreso tra "1" e "100") dovremmo ricrederci; quello che stiamo cercando è uno script che necessiti solo di 2 parametri: i valori iniziale e finale (minimo e massimo) che delimitano il range.
In questo modo il codice utilizzato potrà essere impiegato nuovamente anche per la generazione di output molto "ingombranti".
Il costrutto each do ci pemette di incrementare un valore iniziale fino al raggiungimento di un valore di terminazione passato come argomento al costrutto; vediamo un esempio:
(1..10).each do |i| puts i endQuindi per ogni (each) valore compreso nel range verrà stampata la cifra corrispondente fino al raggiungimento di un valore pari a quello stabilito nella condizione fissata dal secondo parametro (nel nostro caso "10").
Le due barre verticali che racchiudono la variabile d'incremento ("|i|") vengono utilizzate per delimitare la variabile stessa all'interno del ciclo isolandola dal resto del codice in quanto rappresenta un valore "a sé stante".
Lo stesso risultato potrebbe essere ottenuto variando leggermanete la sintassi utilizzata e "risparmiando" sulla quantità di codice da digitare:
(1..10).each { |i| puts i }
Il valore di ritorno sarà quindi restituito tramite l'esecuzione di un'istruzione ("{ |i| puts i }") ripetuta per ogni vaolore del range sulla base dei due parametri che ne delimitano l'esecuzione.
Un'alternativa potrebbe essere basata sull'utilizzo del ciclo for, come nell'esempio seguente:
for i in (1..10) puts i endAnche in questo caso abbiamo passato al ciclo 2 parametri che delimitano il range dei valori che la variabile "i" può assumere incrementandosi durante le 10 iterazioni necessarie, dove il valore "10" rappresenta la condizione che termina l'esecuzione del ciclo.
Ma le nostre alternative non sono finite, passiamo ora ad analizzare questa semplice stringa di codice:
1.upto(10) { |i| puts i }
upto è un metodo per gli oggetti che che rapprentano tipi numerici; la sintassi di questo metodo è alternativa a quella di "for"; scrivere "x.upto(y)" è infatti equivalente a digitare "for (i=x; x<=y; i++) { ... }".In pratica con "upto" possiamo ottenere lo stesso risultato di un ciclo senza dover ricorrere necessariamente ad un loop, ne risulta sia un risparmio in termini di digitazione di codice che di risorse messe a disposizione dal sistema per l'esecuzione di un'istruzione.
Vediamo ora un ultimo esempio:
puts *(1..10)L'ultima stringa di codice proposta è senza dubbio la più semplice tra tutte quelle viste sino ad ora; il semplice utilizzo del simbolo "*" consente di stampare tutti i valori compresi all'interno del range passato come argomento allo statement puts senza dover ricorrere ad alcun ciclo o dover specificare la chiamata di alcun metodo.







