Respostas:
O with_indexmétodo usa um parâmetro opcional para compensar o índice inicial. each_with_indexfaz a mesma coisa, mas não tem índice inicial opcional.
Por exemplo:
[: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
Saídas:
2: foo
3: bar
4: baz
0: foo
1: bar
2: baz
each_with_indexfoi introduzido no Ruby anteriormente. with_indexfoi introduzido mais tarde:
0.Hoje, usar with_indexseria melhor do ponto de vista da generalidade e legibilidade, mas do ponto de vista de agilizar o código, each_with_indexroda um pouco mais rápido do que each.with_index.
Quando você sente que um único método pode ser facilmente expresso pelo encadeamento direto de alguns métodos, geralmente o método único é mais rápido do que a cadeia. Quanto a outro exemplo disso, reverse_eaché executado mais rápido do que reverse.each. Esses métodos têm razão de existir.
reverseexemplo, o reverseestá retornando outra matriz e não um enumerador. Se ele retornou um enumerador, então não deveria ter sido mais lento com uma boa implementação.
with_indexpermite um deslocamento índice inicial,with_indexé geralmente preferível quando utilizado em conjunto commap,reduce,collect, etc Em suma,map.with_indexlê melhor do queeach_with_index.map. Em certo sentido, quando usado commap, é um substituto para omap_with_indexmétodo inexistente .