Elixir - Compreensões
Compreensões de lista são açúcar sintático para loop através de enumerables no Elixir. Neste capítulo, usaremos compreensões para iteração e geração.
Fundamentos
Quando examinamos o módulo Enum no capítulo de enumeráveis, encontramos a função map.
Enum.map(1..3, &(&1 * 2))
Neste exemplo, passaremos uma função como o segundo argumento. Cada item no intervalo será passado para a função e, em seguida, uma nova lista será retornada contendo os novos valores.
Mapear, filtrar e transformar são ações muito comuns no Elixir e, portanto, há uma maneira ligeiramente diferente de obter o mesmo resultado do exemplo anterior -
for n <- 1..3, do: n * 2
Quando executamos o código acima, ele produz o seguinte resultado -
[2, 4, 6]
O segundo exemplo é uma compreensão e, como você provavelmente pode ver, é simplesmente um açúcar sintático para o que você também pode alcançar se usar o Enum.mapfunção. No entanto, não há benefícios reais em usar uma compreensão sobre uma função do módulo Enum em termos de desempenho.
As compreensões não se limitam a listas, mas podem ser usadas com todos os enumeráveis.
Filtro
Você pode pensar nos filtros como uma espécie de guarda para as compreensões. Quando um valor filtrado retornafalse ou nilele é excluído da lista final. Vamos percorrer um intervalo e nos preocupar apenas com os números pares. Vamos usar ois_even função do módulo Integer para verificar se um valor é par ou não.
import Integer
IO.puts(for x <- 1..10, is_even(x), do: x)
Quando o código acima é executado, ele produz o seguinte resultado -
[2, 4, 6, 8, 10]
Também podemos usar vários filtros na mesma compreensão. Adicione outro filtro que você deseja após ois_even filtro separado por vírgula.
: na opção
Nos exemplos acima, todas as compreensões retornaram listas como resultado. No entanto, o resultado de uma compreensão pode ser inserido em diferentes estruturas de dados, passando o:into opção para a compreensão.
Por exemplo, um bitstring gerador pode ser usado com a opção: into para remover facilmente todos os espaços em uma string -
IO.puts(for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>)
Quando o código acima é executado, ele produz o seguinte resultado -
helloworld
O código acima remove todos os espaços da string usando c != ?\s filtrar e depois usar a opção: into, ele coloca todos os caracteres retornados em uma string.