Além da diferença ligeira que with_indexpermite um deslocamento índice inicial, with_indexé geralmente preferível quando utilizado em conjunto com map, reduce, collect, etc Em suma, map.with_indexlê melhor do que each_with_index.map. Em certo sentido, quando usado com map, é um substituto para o map_with_indexmétodo inexistente .
Cary Swoveland
Respostas:
170
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.
each_with_indexfoi introduzido no Ruby anteriormente. with_indexfoi introduzido mais tarde:
para permitir um uso mais amplo com vários enumeradores.
para permitir que o índice comece a partir de um número diferente de 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.
Para ser justo, porém, o deslocamento não altera o índice, ele simplesmente adiciona um número ao índice. Ao verificar o índice após a sua chamada, você descobrirá que ele não foi afetado. Boas notas, como de costume, @sawa
vgoff
2
Não acho que o desempenho deva ser diferente (pelo menos não substancialmente). No 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_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 .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:
Saídas:
fonte
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 queeach.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 quereverse.each
. Esses métodos têm razão de existir.fonte
reverse
exemplo, oreverse
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.