Busqué en Google esto y obtuve opiniones irregulares / contradictorias: ¿hay realmente alguna diferencia entre hacer un map
y hacer un collect
en una matriz en Ruby / Rails?
Los documentos no parecen sugerir ninguno, pero ¿hay quizás diferencias en el método o el rendimiento?
map
se prefiere en Code Golf .map
se prefiere en CodeGolf, lo que puede no ser obvio para todos: es solo porquecollect
tiene cuatro caracteres másmap
, pero la misma funcionalidad.collect
más legible y natural: la idea de 'recopilar' registros y hacerles X tiene más sentido natural para mí que 'mapear' registros y hacerles X.Respuestas:
No hay diferencia, de hecho,
map
se implementa en C comorb_ary_collect
yenum_collect
(por ejemplo, hay una diferencia entremap
una matriz y cualquier otra enumeración, pero no hay diferencia entremap
ycollect
).¿Por qué ambos
map
ycollect
existen en Ruby? Lamap
función tiene muchas convenciones de nomenclatura en diferentes idiomas. Wikipedia proporciona una descripción general :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
ocount
.fuente
count
,length
osize
. Diferentes palabras para el mismo atributo de una matriz, pero con esto, Ruby le permite elegir la palabra más apropiada para su código: ¿desea la cantidad de elementos que está recopilando, la longitud de una matriz o el tamaño actual de la estructura. Esencialmente, son todos iguales, pero elegir la palabra correcta puede hacer que su código sea más fácil de leer, lo cual es una buena propiedad del lenguaje.Me han dichoque son lo mismo.En realidad, están documentados en el mismo lugar en ruby-doc.org:
http://www.ruby-doc.org/core/classes/Array.html#M000249
fuente
Hice una prueba de referencia para intentar responder esta pregunta, luego encontré esta publicación, así que aquí están mis hallazgos (que difieren ligeramente de las otras respuestas)
Aquí está el código de referencia:
Y los resultados que obtuve fueron:
¿Quizás un alias no es gratis?
fuente
Los métodos
collect
ycollect!
son alias demap
ymap!
, por lo que se pueden usar indistintamente. Aquí hay una manera fácil de confirmar eso:fuente
Ruby alias el método Array # map to Array # collect; Se pueden usar indistintamente. (Monje rubí)
En otras palabras, el mismo código fuente:
http://ruby-doc.org/core-2.2.0/Array.html#method-i-map
fuente