446 votes

Différence entre la carte et de recueillir en Ruby ?

J’ai googlé ce et eu Avis inégales / contradictoires - y a-t-il réellement une différence entre faire un et faire un sur un tableau dans Ruby/Rails ?

Les docs ne semblent pas suggérer tout, mais y a-t-il peut-être des différences dans la méthode ou la performance ?

501voto

Jakub Hampl Points 19161

Il n'y a pas de différence, en fait map est mis en œuvre dans le C rb_ary_collect et enum_collect (eg. il y a une différence entre map sur un tableau et sur toute autre enum, mais pas de différence entre map et collect).


Pourquoi faire les deux map et collect existent en Ruby? L' map fonction a beaucoup de conventions de noms dans différentes langues. Wikipedia fournit une vue d'ensemble:

La fonction map origine dans les langages de programmation fonctionnelle, mais est aujourd'hui pris en charge (ou peut être défini) dans de nombreuses procédural, orienté objet, et multi-paradigme langues: En C++Standard Template Library), il est appelé transform, en C# (3.0)'s LINQ bibliothèque, il est fourni comme une extension de la méthode appelée Select. La carte est également l'un des plus fréquemment utilisés opération à haut niveau des langages tels que Perl, Python et Ruby; l'opération est appelée map dans chacun de ces trois langues. Un collect alias pour carte est également fourni en Ruby (à partir de Smalltalk) [c'est moi qui souligne]. Common Lisp fournit une famille de la carte-comme les fonctions, l'une correspondant au comportement décrit ici est appelé mapcar (-véhicule indiquant l'accès à l'aide de l'utilisation d'une VOITURE).

Ruby fournit un alias pour les programmeurs de la Causerie monde pour se sentir plus à l'aise.


Pourquoi est-il une mise en œuvre différente pour les tableaux et les énumérations? Un enum est généralisée itération de la structure, ce qui signifie qu'il n'y a aucune façon de Ruby peut prédire ce que l'élément suivant peut être (vous pouvez définir l'infini des enums, voir le Premier pour un exemple). Par conséquent, il doit appeler une fonction à chaque élément successif (généralement, ce sera l' each méthode).

Les tableaux sont de collecte les plus courantes et il est donc raisonnable d'optimiser leurs performances. Depuis Ruby sait beaucoup de choses sur la façon dont les matrices de travail, il n'a pas à appeler each mais ne peut utiliser de simples de manipulation du pointeur qui est nettement plus rapide.

Similaire optimisations existent pour un certain nombre de méthodes de Tableau comme zip ou count.

54voto

OscarRyz Points 82553

J'ai été dit, ils sont les mêmes.

En fait, ils sont documentés dans le même endroit sous ruby-doc.org:

http://www.ruby-doc.org/core/classes/Array.html#M000249

  • ary.recueillir {|item| bloc } → new_ary
  • ary.carte {|item| bloc } → new_ary
  • ary.recueillir → an_enumerator
  • ary.carte → an_enumerator

Invoque bloquer une fois pour chaque élément de l'auto. Crée un nouveau tableau contenant les valeurs renvoyées par le bloc. Voir aussi Énumérable#recueillir.
Si aucun bloc n'est donné, un agent recenseur est retourné à la place.

a = [ "a", "b", "c", "d" ]
a.collect {|x| x + "!" }   #=> ["a!", "b!", "c!", "d!"]
a                          #=> ["a", "b", "c", "d"]

-3voto

drosenblatt Points 11

Les réponses ci-dessus sont bonnes, mais je suis sûr qu’ils voulaient juste pouvoir dire que les tableaux peuvent « appels à frais virés. »

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X