Array#each executa o bloco fornecido para cada elemento da matriz e, a seguir, retorna a própria matriz.
Array#map também executa o bloco fornecido para cada elemento da matriz, mas retorna uma nova matriz cujos valores são os valores de retorno de cada iteração do bloco.
Exemplo: suponha que você tenha uma matriz definida assim:
Observe que o valor de retorno é simplesmente o mesmo array. O código dentro do eachbloco é executado, mas os valores calculados não são retornados; e como o código não tem efeitos colaterais, este exemplo não executa nenhum trabalho útil.
Em contraste, chamar o mapmétodo da matriz retorna uma nova matriz cujos elementos são os valores de retorno de cada rodada de execução do mapbloco:
Resposta perfeita para entender. Apenas um .. Aviso de isenção: se você usar demais o valor de retorno da função de mapa, poderá desperdiçar muita memória.
Imran Ahmad
33
Os efeitos colaterais são os mesmos, o que confunde sua engenharia reversa.
Sim, ambos iteram sobre o array (na verdade, sobre qualquer coisa que se misture em Enumerable ), mas map retornará um Array composto dos resultados do bloco, enquanto cada um retornará apenas o Array original.
Neste caso, não passei um bloco, mas apenas um Symbol, no entanto, os class Symbolobjetos têm um to_procmétodo que resultará em:
[:how.to_s,:now.to_s,...]
BTW, você pode estar tendo dificuldade em encontrar a documentação porque map é um método em Enumerable, enquanto cada (o único método exigido pelo módulo Enumerable ) é um método em Array .
Como uma curiosidade: a implementação do mapa é baseada em cada um .
quando você usa map para um hash, ele converte implicitamente o hash em uma matriz, então você tem
[["d",[11,22]],["f",[33,44,55]]]
vs.each {...} apenas retorna a última avaliação, que é [11, 22] para ["d", [11, 22]] e [33, 44, 55] para ["f", [ 33, 44, 55]]. Então, antes da última junção, você tem
Esta não é uma resposta à pergunta. a questão é sobre a diferença entre each, que executa o bloco dado e retorna o array original; e map, que retorna uma matriz com o resultado da execução do bloco como valores
Os efeitos colaterais são os mesmos, o que confunde sua engenharia reversa.
Sim, ambos iteram sobre o array (na verdade, sobre qualquer coisa que se misture em Enumerable ), mas map retornará um Array composto dos resultados do bloco, enquanto cada um retornará apenas o Array original.
O valor de retorno de cada um é apenas o array original e raramente é usado no código Ruby, mas map é uma das ferramentas funcionais mais importantes .
O que
map
faz é retornar um array que contém os resultados do bloco ou método nomeado que é passado. Por exemplo:Neste caso, não passei um bloco, mas apenas um
Symbol
, no entanto, osclass Symbol
objetos têm umto_proc
método que resultará em:BTW, você pode estar tendo dificuldade em encontrar a documentação porque map é um método em Enumerable, enquanto cada (o único método exigido pelo módulo Enumerable ) é um método em Array .
Como uma curiosidade: a implementação do mapa é baseada em cada um .
fonte
Aqui está uma rápida demonstração de como o mapa difere de cada
Você vê que o mapa retornos
["map_a", "map_b", "map_c"]
Considerando que cada apenas repete, mas retorna a matriz original:["a", "b", "c"]
.Portanto, cada um é usado para processar um array e map é usado para fazer algo com um array processado.
fonte
.each
retorna a mesma matriz que você forneceu inicialmente:.map
retorna um novo Array com os resultados de cada chamada em bloco:fonte
Array # cada método retorna o mesmo array
O método Array # map retorna uma nova matriz
fonte
quando você usa map para um hash, ele converte implicitamente o hash em uma matriz, então você tem
vs.each {...} apenas retorna a última avaliação, que é [11, 22] para ["d", [11, 22]] e [33, 44, 55] para ["f", [ 33, 44, 55]]. Então, antes da última junção, você tem
fonte
Você também pode usar
map
com estrondomap!
esse array de mudança de origemfonte
each
, que executa o bloco dado e retorna o array original; emap
, que retorna uma matriz com o resultado da execução do bloco como valores