select filtra elementos
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
selectmantém os elementos em que o bloco é truthy e deixa o original intocado.- Diferente do
map, o resultado doselectpode 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
trueoufalse.
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.