Je ne comprends vraiment pas la différence entre each.with_indexet each_with_index. Ils sont de types différents mais semblent identiques dans la pratique.
Réponses:
La with_indexméthode prend un paramètre facultatif pour décaler l'index de départ. each_with_indexfait la même chose, mais n'a pas d'index de départ optionnel.
Par exemple:
[: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
Les sorties:
2: foo
3: bar
4: baz
0: foo
1: bar
2: baz
each_with_indexa été introduit dans Ruby plus tôt. with_indexa été introduit plus tard:
0.Aujourd'hui, l'utilisation with_indexserait meilleure du point de vue de la généralité et de la lisibilité, mais du point de vue de l'accélération du code, each_with_indexfonctionne légèrement plus vite que each.with_index.
Lorsque vous pensez qu'une seule méthode peut être facilement exprimée par un chaînage simple de quelques méthodes, il est généralement vrai que la méthode unique est plus rapide que la chaîne. Comme pour un autre exemple de cela, reverse_eachfonctionne plus vite que reverse.each. Ces méthodes ont des raisons d'exister.
reverseexemple, le reverserenvoie un autre tableau et non un énumérateur. S'il a renvoyé un énumérateur, cela n'aurait pas dû être plus lent avec une bonne implémentation.
with_indexpermet un indice de départ offset,with_indexon préfère généralement lorsqu'il est utilisé conjointement avecmap,reduce,collect, etc. Bref,map.with_indexlit mieux queeach_with_index.map. Dans un sens, lorsqu'il est utilisé avecmap, c'est un substitut à lamap_with_indexméthode inexistante .