Je ne comprends vraiment pas la différence entre each.with_index
et each_with_index
. Ils sont de types différents mais semblent identiques dans la pratique.
Réponses:
La with_index
méthode prend un paramètre facultatif pour décaler l'index de départ. each_with_index
fait 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_index
a été introduit dans Ruby plus tôt. with_index
a été introduit plus tard:
0
.Aujourd'hui, l'utilisation with_index
serait 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_index
fonctionne 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_each
fonctionne plus vite que reverse.each
. Ces méthodes ont des raisons d'exister.
reverse
exemple, le reverse
renvoie 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_index
permet un indice de départ offset,with_index
on préfère généralement lorsqu'il est utilisé conjointement avecmap
,reduce
,collect
, etc. Bref,map.with_index
lit mieux queeach_with_index.map
. Dans un sens, lorsqu'il est utilisé avecmap
, c'est un substitut à lamap_with_index
méthode inexistante .