Risposte:
Il with_indexmetodo accetta un parametro opzionale per compensare l'indice iniziale. each_with_indexfa 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_indexsarebbe migliore dal punto di vista della generalità e della leggibilità, ma dal punto di vista della velocizzazione del codice, each_with_indexgira 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_eachfunziona più velocemente di reverse.each. Questi metodi hanno motivo di esistere.
reverseesempio, la reversesta tornando un'altra matrice, e non un enumeratore. Se ha restituito un enumeratore, non avrebbe dovuto essere più lento con una buona implementazione.
with_indexpermette 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_indexmetodo inesistente .