No hay diferencia, de hecho, map
se implementa en C como rb_ary_collect
y enum_collect
(por ejemplo, hay una diferencia entre map
una matriz y cualquier otra enumeración, pero no hay diferencia entre map
y collect
).
¿Por qué ambos map
y collect
existen en Ruby? La map
función tiene muchas convenciones de nomenclatura en diferentes idiomas. Wikipedia proporciona una descripción general :
La función de mapa se originó en lenguajes de programación funcionales, pero hoy en día también es compatible (o puede definirse) en muchos lenguajes de procedimientos, orientados a objetos y multi-paradigmas: en la Biblioteca de plantillas estándar de C ++, se llama transform
, en C # (3.0) Biblioteca LINQ, se proporciona como un método de extensión llamado Select
. Map también es una operación de uso frecuente en lenguajes de alto nivel como Perl, Python y Ruby; La operación se llama map
en los tres idiomas. También se proporciona un collect
alias para el mapa en Ruby (de Smalltalk) [énfasis mío]. Common Lisp proporciona una familia de funciones tipo mapa; el que corresponde al comportamiento descrito aquí se llama mapcar
(-car que indica acceso usando la operación CAR).
Ruby proporciona un alias para que los programadores del mundo Smalltalk se sientan más en casa.
¿Por qué hay una implementación diferente para matrices y enumeraciones? Una enumeración es una estructura de iteración generalizada, lo que significa que no hay forma de que Ruby pueda predecir cuál puede ser el siguiente elemento (puede definir enumeraciones infinitas, consulte Prime para ver un ejemplo). Por lo tanto, debe llamar a una función para obtener cada elemento sucesivo (generalmente este será el each
método).
Las matrices son la colección más común, por lo que es razonable optimizar su rendimiento. Dado que Ruby sabe mucho sobre cómo funcionan las matrices, no tiene que llamar, each
pero solo puede usar la manipulación de puntero simple, que es significativamente más rápido.
Existen optimizaciones similares para varios métodos de matriz como zip
o count
.
map
se prefiere en Code Golf .