Não há diferença, de fato map
é implementado em C como rb_ary_collect
e enum_collect
(por exemplo, há uma diferença entre map
em uma matriz e em qualquer outra enumeração, mas não há diferença entre map
e collect
).
Por que ambos map
e collect
existem no Ruby? A map
função possui muitas convenções de nomenclatura em diferentes idiomas. A Wikipedia fornece uma visão geral :
A função map originou-se em linguagens de programação funcional, mas hoje é suportada (ou pode ser definida) em muitas linguagens procedurais, orientadas a objetos e com vários paradigmas: Na Biblioteca de Modelos Padrão do C ++, ela é chamada transform
, em C # (3.0), Biblioteca LINQ, é fornecido como um método de extensão chamado Select
. Map também é uma operação frequentemente usada em linguagens de alto nível, como Perl, Python e Ruby; a operação é chamada map
nos três idiomas. Um collect
alias para o mapa também é fornecido em Ruby (do Smalltalk) [ênfase meu]. O Lisp comum fornece uma família de funções semelhantes a mapas; o que corresponde ao comportamento descrito aqui é chamado mapcar
(-car indicando acesso usando a operação CAR).
O Ruby fornece um alias para os programadores do mundo Smalltalk se sentirem mais em casa.
Por que existe uma implementação diferente para matrizes e enumerações? Uma enumeração é uma estrutura de iteração generalizada, o que significa que não há como Ruby prever o que o próximo elemento pode ser (você pode definir enumerações infinitas, consulte Prime, por exemplo). Portanto, ele deve chamar uma função para obter cada elemento sucessivo (normalmente esse será o each
método).
Matrizes são a coleção mais comum, portanto, é razoável otimizar seu desempenho. Como Ruby sabe muito sobre como as matrizes funcionam, não precisa chamar, each
mas pode usar apenas a manipulação simples de ponteiros, que é significativamente mais rápida.
Otimizações semelhantes existem para vários métodos de matriz como zip
ou count
.
map
é preferido no Code Golf .