map transforma todo elemento

Prévia grátis 2 min de leitura

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

  • map junta 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 each o descarta.
  • Use map quando o objetivo é uma coleção transformada, não um efeito colateral.
Aula 1 de 7 · grátis

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.

Digite para buscar...