Enum

Algumas funções nativas no Elixir utilizam recursão estão disponíveis para utilizarmos com uma API limpa. O módulo Enum é um deles. Para entender melhor o que é um Enum, leia o conceito de Enumeráveis.

Vamos a um exemplo real com base em algumas funções que Enum tem.

Enum.each/2

Supomos que precisamos percorrer todos os itens de uma lista mandando um email para cada email da lista.

Utilizaremos para esse looping onde só precisamos percorrer a lista a função Enum.each/2 (caso não esteja familiado com o conceito de aridade, recomendo o capítulo sobre Aridade)

Para rodar o Enum.each/2 precisamos um primeiro argumento onde será nossa lista e o segundo argumento uma função anonima com apenas um argumento (que será cada item da nossa lista, passada no primeiro argumento).

Vamos criar um teste para isso

test/send_email_test.exs
defmodule EnumTest do
  use ExUnit.Case

  describe "Enum.each/2" do
    test "simple tests about Enum.each" do
      my_list = ["[email protected]", "[email protected]"]

      Enum.each(my_list, fn email ->
        assert "Email sent to #{email}" == Email.send(email)
      end)
    end
  end
end

Não possuímos o módulo Email nem a função send. Vamos cria-los.

Fizemos uma função inline, somente para exemplificar o looping. Basta rodar os testes e tudo estará bem.

Enum.map/2

Agora supomos que precisamos alterar a lista para, ao invez de enviar o email, gere links para clicarmos e sermos redirecionados a um cliente de email. Uma vez que precisamos alterar os dados, utilizaremos Enum.map/2 que tem como ideia mapear novamente os dados dentro dele.

Vamos ao teste

Perceba que criamos uma nova variável e assinamos o retorno da função map/2 lá. Como Elixir é uma linguagem funcional, nada se muta, precisamos sempre re-assinar um valor para que a variável tenha um outro valor. (Veja mais sobre imutabilidade no capítulo de Imutabilidade)

A função map serve para alterar o valor que vem de uma lista, sem precisarmos abrir um por um, ja possuindo uma estrutura de repetição onde você passa a lista e o que quer que faça com cada elemento da lista, retornando para seu próprio valor.

Depois disso, apenas comparamos a um valor experado que definimos. Basta rodar o testes e verá a mágica acontecer.

Last updated

Was this helpful?