Eu pesquisei isso no Google e obtive opiniões irregulares / contraditórias - existe realmente alguma diferença entre fazer um map
e fazer um collect
em uma matriz no Ruby / Rails?
Os documentos parecem não sugerir nenhum, mas talvez haja diferenças de método ou desempenho?
map
é preferido no Code Golf .map
é preferível no CodeGolf, o que pode não ser óbvio para todos: é apenas porquecollect
tem quatro caracteres a maismap
, mas o mesmo em funcionalidade.collect
mais legível e natural - a idéia de 'coletar' registros e fazer X com eles faz mais sentido para mim do que 'mapear' registros e fazer X com eles.Respostas:
Não há diferença, de fato
map
é implementado em C comorb_ary_collect
eenum_collect
(por exemplo, há uma diferença entremap
em uma matriz e em qualquer outra enumeração, mas não há diferença entremap
ecollect
).Por que ambos
map
ecollect
existem no Ruby? Amap
função possui muitas convenções de nomenclatura em diferentes idiomas. A Wikipedia fornece uma visão geral :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
oucount
.fonte
count
,length
ousize
. Palavras diferentes para o mesmo atributo de uma matriz, mas, com isso, Ruby permite que você escolha a palavra mais apropriada para o seu código: deseja o número de itens que está coletando, o comprimento de uma matriz ou o tamanho atual de a estrutura. Essencialmente, eles são todos iguais, mas escolher a palavra certa pode facilitar a leitura do código, o que é uma boa propriedade do idioma.Disseram-meque são iguais.Na verdade, eles estão documentados no mesmo local em ruby-doc.org:
http://www.ruby-doc.org/core/classes/Array.html#M000249
fonte
Fiz um teste de benchmark para tentar responder a essa pergunta e, em seguida, encontrei este post. Aqui estão minhas descobertas (que diferem um pouco das outras respostas)
Aqui está o código de referência:
E os resultados que obtive foram:
Talvez um apelido não seja gratuito?
fonte
Os métodos
collect
ecollect!
são aliases paramap
emap!
, portanto, eles podem ser usados de forma intercambiável. Aqui está uma maneira fácil de confirmar que:fonte
Ruby usa o método Array # map para Array # collect; eles podem ser usados de forma intercambiável. (Ruby Monk)
Em outras palavras, o mesmo código fonte:
http://ruby-doc.org/core-2.2.0/Array.html#method-i-map
fonte