Mai usare mai for
può causare bug.
La differenza è sottile ma può causare tremendi bug!
Non fatevi ingannare, non si tratta di codice idiomatico o di problemi di stile. Si tratta di evitare bug quasi irreperibili nel codice di produzione. L'implementazione di Ruby di for
ha un difetto grave e non dovrebbe essere utilizzata. Utilizzare sempre i loop each
, non utilizzare mai il ciclo for
.
Ecco un esempio in cui for
introduce un bug,
class Library
def initialize
@ary = []
end
def method_with_block(&block)
@ary << block
end
def method_that_uses_these_blocks
@ary.map(&:call)
end
end
lib = Library.new
for n in %w{foo bar quz}
lib.method_with_block { n }
end
puts lib.method_that_uses_these_blocks
Stampe
quz
quz
quz
Uso %w{foo bar quz}.each { |n| ... }
stampe
foo
bar
quz
Perché?
In un ciclo for
la variabile n
viene definita una sola volta e quindi quella definizione viene utilizzata per tutte le iterazioni. Quindi ogni blocco si riferisce allo stesso n
che ha un valore di quz
al termine del ciclo. Bug!
In un ciclo each
una nuova variabile n
viene definita per ogni iterazione, ad esempio sopra la variabile n
viene definita tre volte separate. Quindi ogni blocco si riferisce a un separato n
con i valori corretti.
C'è una piccola differenza (come menzionano yjerem, ChristopheD e Bayard) in merito alla portata variabile. – Telemachus
errato, 'for' non usa' each' sotto. Vedi altre risposte. – akuhn
@akuhn Per ulteriori chiarimenti, si prega di consultare questa [domanda] (http://stackoverflow.com/q/39839809/5101493) ed entrambe le sue eccellenti risposte. –