Respostas:
O with_index
método usa um parâmetro opcional para compensar o índice inicial. each_with_index
faz 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_index
foi introduzido no Ruby anteriormente. with_index
foi introduzido mais tarde:
0
.Hoje, usar with_index
seria melhor do ponto de vista da generalidade e legibilidade, mas do ponto de vista de agilizar o código, each_with_index
roda 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.
reverse
exemplo, o reverse
está 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_index
permite um deslocamento índice inicial,with_index
é geralmente preferível quando utilizado em conjunto commap
,reduce
,collect
, etc Em suma,map.with_index
lê melhor do queeach_with_index.map
. Em certo sentido, quando usado commap
, é um substituto para omap_with_index
método inexistente .