map transforma todo elemento
Um método construído para retornar algo novo
O curso anterior definiu o trabalho do each: rodar código uma vez por elemento pelos efeitos colaterais e devolver a mesma coleção. O map faz o trabalho oposto.
numbers = [1, 2, 3]
doubled = numbers.map { |n| n * 2 }
doubled # => [2, 4, 6]
numbers # => [1, 2, 3], intocado
map chama o bloco uma vez por elemento, como o each, mas junta cada valor que o bloco calcula num array novo e o devolve. numbers fica intocado, o padrão "devolve novo, não altera" que o curso de arrays mostrou com sort.
O resultado sempre tem o mesmo comprimento do original
words = ["cat", "elephant", "dog"]
lengths = words.map { |w| w.length }
lengths # => [3, 8, 3]
Três palavras entram, três números saem. map nunca pula nem acrescenta um elemento, então o resultado se alinha com o original: lengths[0] descreve words[0], lengths[1] descreve words[1], e assim por diante.
O que o bloco do map retorna importa
Aqui está a diferença real em relação ao each. O each descarta o valor de retorno do bloco. Para o map, esse valor é o objetivo: ele vira o elemento correspondente do array novo.
numbers = [1, 2, 3]
numbers.each { |n| n * 2 } # => [1, 2, 3], o *2 é descartado
numbers.map { |n| n * 2 } # => [2, 4, 6], o *2 vira o resultado
Mesmo bloco e mesma entrada, mas retornos diferentes, porque os dois métodos tratam o resultado do bloco de formas diferentes.
Pontos-chave
mapjunta cada resultado do bloco num array novo e deixa o original intocado.- O resultado sempre tem o mesmo tamanho do original, alinhado posição a posição.
- O valor de retorno do bloco vira o elemento novo; o
eacho descarta. - Use
mapquando o objetivo é uma coleção transformada, não um efeito colateral.
Continue com a aula 2
map vs each
Use each para efeitos colaterais e map para uma coleção nova, conforme o destino do resultado do bloco.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.