select filtra elementos

Prévia grátis 2 min de leitura

Um método construído para manter alguns, descartar outros

A aula 6 do curso anterior terminou numa armadilha: o map não consegue pular um elemento, mesmo quando a lógica do bloco parece pedir isso. O select foi feito para esse trabalho.

numbers = [1, 2, 3, 4, 5]
evens = numbers.select { |n| n.even? }
evens     # => [2, 4]
numbers   # => [1, 2, 3, 4, 5], intocado

select chama o bloco uma vez por elemento, como each e map, mas mantém só os elementos em que o bloco devolveu algo truthy. numbers fica intocado, o padrão "devolve novo, não altera" que a família inteira segue.

O resultado pode ter qualquer comprimento, incluindo zero

Aqui está a diferença em relação ao map. O resultado do map sempre tem o tamanho da entrada. O do select pode ser menor, do mesmo tamanho ou vazio.

numbers = [1, 3, 5]
numbers.select { |n| n.even? }   # => [], nada combinou, e isso é um resultado válido

Um array vazio vindo do select não é erro. É um resultado normal que quer dizer que nada casou.

Qualquer resultado truthy mantém o elemento

names = ["Ada", "", "Grace", nil, "Kim"]
names.select { |name| name }
# => ["Ada", "", "Grace", "Kim"], a string vazia sobrevive; só o nil foi descartado

select mantém um elemento sempre que o resultado do bloco é truthy, a regra de Lógica Ruby. Só nil e false são falsy. Todo o resto é truthy e fica, incluindo a string vazia "", e por isso ela sobrevive acima. "" é falsy em muitas outras linguagens, mas não em Ruby. O bloco não precisa devolver true ou false; qualquer expressão serve.

Pontos-chave

  • select mantém os elementos em que o bloco é truthy e deixa o original intocado.
  • Diferente do map, o resultado do select pode ser menor que a entrada, ou vazio.
  • Um resultado vazio quer dizer que nada casou; não é erro.
  • Qualquer resultado truthy mantém o elemento; o bloco não precisa devolver true ou false.
Aula 1 de 7 · grátis

Continue com a aula 2

select vs map vs each

Compara each, map e select, e mostra como filtrar com select antes de transformar com map.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...