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.