# PerchÃ¨ il ciclo For in Ruby Ã¨ sconsigliato?

**URL:** <https://www.ruby-forum.com/t/percha-il-ciclo-for-in-ruby-a-sconsigliato/189841>\
**Category:** IT\
**Created:** [June 8, 2010, 5:35pm UTC](https://www.ruby-forum.com/t/percha-il-ciclo-for-in-ruby-a-sconsigliato/189841 "2010-06-08T17:35:10Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![axle988](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e47774/32.png) [@axle988](https://www.ruby-forum.com/u/axle988)\
**Post date:** [June 8, 2010, 5:35pm UTC](https://www.ruby-forum.com/t/percha-il-ciclo-for-in-ruby-a-sconsigliato/189841/1 "2010-06-08T17:35:10Z")

</div>

Ciao.  
Su un libro che sto leggendo per imparare Ruby s’Ã¨ scritta la seguente  
affermazione:

Il ciclo for Ã¨ implementato internamente tramite l’iteratore proprio  
dell’oggetto preso in considerazione. Per questo motivo, e anche per  
mantenere il codice piÃ¹ vicino alla filosofia di Ruby, sconsigliamo un  
uso massiccio dei costrutti for: Ã¨ molto meglio usare i blocchi e gli  
iteratori.

Io adesso non capisco le seguenti cose:

- Cosa vuol dire che il ciclo for Ã¨ implementato internamente tramite  
l’iteratore proprio dell’oggetto preso in considerazione?
- PerchÃ¨ sono meglio gli iteratori che i cicli for?

Ciao.  
KioSirio

---

<div class="post-metadata">

**Author:** ![axle988](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e47774/32.png) [@axle988](https://www.ruby-forum.com/u/axle988)\
**Post date:** [June 8, 2010, 5:59pm UTC](https://www.ruby-forum.com/t/percha-il-ciclo-for-in-ruby-a-sconsigliato/189841/2 "2010-06-08T17:59:42Z")

</div>

Un iteratore “astrae” dalla logica di implementazione della  
sottostante struttura dati, mentre con il ciclo for faresti l’esatto  
contrario (ma ciò non accade in Ruby, che anche per il ciclo for usa  
l’iteratore fornito dall’oggetto).

E’ la stessa differenza tra “per ogni bottone della giacca: cucilo” e  
“numerando da 0 ad N-1 i bottoni della giacca: cuci il bottone  
i-esimo” 😉

Il 08 giugno 2010 17.35, Ivan m. Greggio [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> Io adesso non capisco le seguenti cose:  
> removed\_email\_address@domain.invalid  
> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

–  
Carlo P.  
email: removed\_email\_address@domain.invalid  
twitter: @carlopecchia

---

<div class="post-metadata">

**Author:** ![axle988](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e47774/32.png) [@axle988](https://www.ruby-forum.com/u/axle988)\
**Post date:** [June 8, 2010, 6:21pm UTC](https://www.ruby-forum.com/t/percha-il-ciclo-for-in-ruby-a-sconsigliato/189841/3 "2010-06-08T18:21:57Z")

</div>

2010/6/8 Ivan m. Greggio [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Io adesso non capisco le seguenti cose:
> 
> - Cosa vuol dire che il ciclo for è implementato internamente tramite  
> l’iteratore proprio dell’oggetto preso in considerazione?

il metodo #each di un’oggetto è quello che fa l’iterazione, `for` è  
quello che si chiama “syntax sugar” ma ruby sotto sotto usa each:

> > a=Object.new  
> > =\> #Object:0x1b99064  
> > def a.each() yield “primo”; yield “secondo”; yield “terzo” end  
> > =\> nil  
> > for i in a  
> > print i  
> > end  
> > primosecondoterzo=\> nil

> - Perchè sono meglio gli iteratori che i cicli for?

è solo che i metodi con i blocchi sono più generali. Se vuoi fare  
un’iterazione usi #each se vuoi trasformare una sequenza usi #map e se  
vuoi filtrarla usi #filter, quindi li avrai sempre in giro per il  
codice e può essere più consistente se usi #each invece del for.  
Ma come ti hanno già detto, è solo una questione stilistica fai come ti pare  
🙂

---

<div class="post-metadata">

**Author:** ![axle988](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e47774/32.png) [@axle988](https://www.ruby-forum.com/u/axle988)\
**Post date:** [June 9, 2010, 11:27am UTC](https://www.ruby-forum.com/t/percha-il-ciclo-for-in-ruby-a-sconsigliato/189841/4 "2010-06-09T11:27:40Z")

</div>

Nonostante apprezzi i blocchi, trovo il for leggermente piÃ¹ leggibile e  
veloce da scrivere sicuramente non lo sconsiglierei come fa quel libro  
anche perchÃ¨ usando ruby 1.8.7, il for Ã¨ piÃ¹ veloce del 30%

```
                       user system total real

```

For: 12.421000 0.000000 12.421000 ( 12.421160)  
Each: 16.547000 0.000000 16.547000 ( 16.577122)

Usando ruby 1.9.1 p368 invece siamo li, Ã¨ piÃ¹ veloce l’each dell’11%:

```
                       user system total real

```

For: 8.593000 0.000000 8.593000 ( 8.593035)  
Each: 7.625000 0.000000 7.625000 ( 7.639989)

Questo Ã¨ lo script:

require “benchmark”  
include Benchmark

n=100\_000\_000  
elements=Array.new(n, ‘’)

Benchmark.bm(21, “— Total:”) do|b|  
b.report(“For:”) do  
for element in elements  
element  
end  
end

b.report(“Each:”) do  
elements.each do |element|  
element  
end  
end  
end

---

<div class="post-metadata">

**Author:** ![axle988](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e47774/32.png) [@axle988](https://www.ruby-forum.com/u/axle988)\
**Post date:** [June 8, 2010, 6:06pm UTC](https://www.ruby-forum.com/t/percha-il-ciclo-for-in-ruby-a-sconsigliato/189841/5 "2010-06-08T18:06:29Z")

</div>

Ivan M. wrote:

> Ciao.  
> Su un libro che sto leggendo per imparare Ruby s’Ã¨ scritta la seguente  
> affermazione:
> 
> Il ciclo for Ã¨ implementato internamente tramite l’iteratore proprio  
> dell’oggetto preso in considerazione. Per questo motivo, e anche per  
> mantenere il codice piÃ¹ vicino alla filosofia di Ruby, sconsigliamo un  
> uso massiccio dei costrutti for: Ã¨ molto meglio usare i blocchi e gli  
> iteratori.
> 
> Io adesso non capisco le seguenti cose:
> 
> - Cosa vuol dire che il ciclo for Ã¨ implementato internamente tramite  
> l’iteratore proprio dell’oggetto preso in considerazione?
> - PerchÃ¨ sono meglio gli iteratori che i cicli for?
> 
> Ciao.  
> KioSirio

Per la prima domanda significa che se hai un oggetto iterabile ottenuto  
ad esempi con una find(:all) puoi iterare su questo oggetto in questo  
modo:

oggetto.each do |elemento|  
elemento.descrizione = ‘pippo’ # cosÃ¬ assegni pippo al campo  
‘descrizione’  
# di ogni elemento contenuto in  
“oggetto”  
end

Per la seconda domanda non saprei ma credo solo che sia una questione di  
stile di programmazione, nessuno ti vieta di utilizzare il for se vuoi  
farlo.

---

<div class="post-metadata">

**Author:** ![axle988](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e47774/32.png) [@axle988](https://www.ruby-forum.com/u/axle988)\
**Post date:** [June 10, 2010, 8:51am UTC](https://www.ruby-forum.com/t/percha-il-ciclo-for-in-ruby-a-sconsigliato/189841/6 "2010-06-10T08:51:48Z")

</div>

Ciao Pietro,  
ho dimenticato di specificare la patch 249 per ruby 1.8.7 ma come come  
hai letto, ho specificato le versioni e indicato le differenze, non  
dovrebbero generare confusione, anzi.  
Non ho mai avuto occasione di gestire cosÃ¬ tante iterazioni in una sola  
volta ma quello Ã¨ un test usato per evidenziare la differenza. Prova a  
sommare tutte le percentuali, naturalmente anche per tutte le altre  
differenze apparentemente banali (operazioni matematiche, concatenamenti  
di stringhe ecc.) …una procedura puÃ² impiegare mooolto tempo, in  
relazione alla complessitÃ .  
Nell’azienda dove lavoro, ho creato procedure batch in ruby che devono  
elaborare molti dati ed ho cercato di ottimizzare ogni singola  
operazione. Trattandosi poi di ambie-nti di produzione, non si cambia  
interprete facilmente quindi Ã¨ un lavoro che si sfrutta per molto tempo.  
Con quell’esperienza avevo anche scritto un articolo sul mio umile blog:  
[http://mastrodonato.info/index.php/2009/08/quattro-interpreti-ruby-a-confronto/](http://mastrodonato.info/index.php/2009/08/quattro-interpreti-ruby-a-confronto/)

---

<div class="post-metadata">

**Author:** ![axle988](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e47774/32.png) [@axle988](https://www.ruby-forum.com/u/axle988)\
**Post date:** [June 9, 2010, 11:49am UTC](https://www.ruby-forum.com/t/percha-il-ciclo-for-in-ruby-a-sconsigliato/189841/7 "2010-06-09T11:49:11Z")

</div>

Il 09 giugno 2010 11.27, Marco M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
ha scritto:

> Nonostante apprezzi i blocchi, trovo il for leggermente più leggibile e  
> veloce da scrivere sicuramente non lo sconsiglierei come fa quel libro  
> anche perchè usando ruby 1.8.7, il for è più veloce del 30%

Ciao,

i consigli relativi alla performance hanno quasi sempre vita breve,  
perché appena esce una nuova release cambia tutto, e in ogni caso è  
veramente raro che facciano questa gran differenza (se nel tuo  
programma c’è un ciclo su un array di 100’000’000 di elementi, molto  
probabilmente c’è un grosso problema a prescindere da come lo fai!).  
La comunità java continua tutt’oggi a essere devastata dai danni di  
consigli sulla performance che valevano per versioni come la 1.2 e che  
oggi sono solo distruttivi.

Diverso è per le considerazioni stilistiche, che però sono molto  
personali, specie per un linguaggio come Ruby.

> ```
> user system total real
> 
> ```
> 
> For: 12.421000 0.000000 12.421000 ( 12.421160)  
> Each: 16.547000 0.000000 16.547000 ( 16.577122)
> 
> Usando ruby 1.9.1 p368 invece siamo li, è più veloce l’each dell’11%:
> 
> ```
> user system total real
> 
> ```
> 
> For: 8.593000 0.000000 8.593000 ( 8.593035)  
> Each: 7.625000 0.000000 7.625000 ( 7.639989)

Molto interessante: evidentemente la gestione dei block è migliorata  
tantissimo.

pietro
