différence entre each.with_index et each_with_index en Ruby?
94
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.
Mis à part la légère différence qui with_indexpermet un indice de départ offset, with_indexon préfère généralement lorsqu'il est utilisé conjointement avec map, reduce, collect, etc. Bref, map.with_indexlit mieux que each_with_index.map. Dans un sens, lorsqu'il est utilisé avec map, c'est un substitut à la map_with_indexméthode inexistante .
Cary Swoveland
Réponses:
171
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.
each_with_indexa été introduit dans Ruby plus tôt. with_indexa été introduit plus tard:
pour permettre une utilisation plus large avec divers recenseurs.
pour permettre à l'index de commencer à partir d'un nombre autre que 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.
Pour être juste cependant, le décalage ne change pas l'index, il ajoute simplement un nombre à l'index. Lorsque vous vérifiez l'index après votre appel, vous constaterez qu'il n'est pas affecté. Bonnes notes comme d'habitude, @sawa
vgoff
2
Je ne pense pas que les performances devraient être différentes (du moins pas substantiellement). Dans l' 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_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 .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:
Les sorties:
la source
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 queeach.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 quereverse.each
. Ces méthodes ont des raisons d'exister.la source
reverse
exemple, lereverse
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.