J'ai googlé ceci et obtenu des opinions inégales / contradictoires - y a-t-il réellement une différence entre faire un map
et faire un collect
sur un tableau dans Ruby / Rails?
Les documents ne semblent pas en suggérer, mais y a-t-il peut-être des différences de méthode ou de performances?
map
est préféré au Code Golf .map
est préféré chez CodeGolf, ce qui pourrait ne pas être évident pour tous: c'est seulement parce qu'ilcollect
fait quatre caractères de plus quemap
, mais la même fonctionnalité.collect
plus lisible et naturel - l'idée de `` collecter '' des enregistrements et de leur faire X est plus logique pour moi que de `` mapper '' des enregistrements et de leur faire X.Réponses:
Il n'y a pas de différence, en fait
map
est implémenté en C au furrb_ary_collect
et à mesureenum_collect
(par exemple, il y a une différence entremap
sur un tableau et sur tout autre énumération, mais aucune différence entremap
etcollect
).Pourquoi les deux
map
etcollect
existent-ils en Ruby? Lamap
fonction possède de nombreuses conventions de dénomination dans différentes langues. Wikipedia donne un aperçu :Ruby fournit un alias pour que les programmeurs du monde Smalltalk se sentent plus à l'aise.
Pourquoi existe-t-il une implémentation différente pour les tableaux et les énumérations? Une énumération est une structure d'itération généralisée, ce qui signifie qu'il n'y a aucun moyen pour Ruby de prédire ce que peut être l'élément suivant (vous pouvez définir des énumérations infinies, voir Prime pour un exemple). Il doit donc appeler une fonction pour obtenir chaque élément successif (ce sera généralement la
each
méthode).Les tableaux sont la collection la plus courante, il est donc raisonnable d'optimiser leurs performances. Étant donné que Ruby sait beaucoup de choses sur le fonctionnement des tableaux, il n'a pas à appeler,
each
mais ne peut utiliser qu'une manipulation de pointeur simple, ce qui est beaucoup plus rapide.Des optimisations similaires existent pour un certain nombre de méthodes de tableau comme
zip
oucount
.la source
count
,length
ousize
. Différents mots pour le même attribut d'un tableau, mais par cela, Ruby vous permet de choisir le mot le plus approprié pour votre code: voulez-vous le nombre d'éléments que vous collectez, la longueur d'un tableau ou la taille actuelle de la structure. Essentiellement, ils sont tous les mêmes, mais choisir le bon mot pourrait rendre votre code plus facile à lire, ce qui est une belle propriété du langage.On m'a dit quece sont les mêmes.En fait, ils sont documentés au même endroit sous ruby-doc.org:
http://www.ruby-doc.org/core/classes/Array.html#M000249
la source
J'ai fait un test de référence pour essayer de répondre à cette question, puis j'ai trouvé ce post alors voici mes résultats (qui diffèrent légèrement des autres réponses)
Voici le code de référence:
Et les résultats que j'ai obtenus étaient:
Peut-être qu'un alias n'est pas gratuit?
la source
Les méthodes
collect
etcollect!
sont des alias demap
etmap!
elles peuvent donc être utilisées de manière interchangeable. Voici un moyen simple de confirmer que:la source
Ruby alias la méthode Array # map to Array # collect; ils peuvent être utilisés de manière interchangeable. (Ruby Monk)
En d'autres termes, même code source:
http://ruby-doc.org/core-2.2.0/Array.html#method-i-map
la source