Risposte:
Il with_index
metodo accetta un parametro opzionale per compensare l'indice iniziale. each_with_index
fa la stessa cosa, ma non ha un indice iniziale opzionale.
Per esempio:
[:foo, :bar, :baz].each.with_index(2) do |value, index|
puts "#{index}: #{value}"
end
[:foo, :bar, :baz].each_with_index do |value, index|
puts "#{index}: #{value}"
end
Uscite:
2: foo
3: bar
4: baz
0: foo
1: bar
2: baz
each_with_index
è stato introdotto in Ruby in precedenza. with_index
è stato introdotto in seguito:
0
.Oggi l'utilizzo with_index
sarebbe migliore dal punto di vista della generalità e della leggibilità, ma dal punto di vista della velocizzazione del codice, each_with_index
gira leggermente più veloce del each.with_index
.
Quando ritieni che un singolo metodo possa essere facilmente espresso concatenando facilmente alcuni metodi, di solito è il caso che il singolo metodo sia più veloce della catena. Per quanto riguarda un altro esempio, reverse_each
funziona più velocemente di reverse.each
. Questi metodi hanno motivo di esistere.
reverse
esempio, la reverse
sta tornando un'altra matrice, e non un enumeratore. Se ha restituito un enumeratore, non avrebbe dovuto essere più lento con una buona implementazione.
with_index
permette un offset indice iniziale,with_index
è generalmente preferito se usato in combinazione conmap
,reduce
,collect
, ecc In breve,map.with_index
è più leggibileeach_with_index.map
. In un certo senso, se usato conmap
, è un sostituto delmap_with_index
metodo inesistente .