Tuplas

A tupla é uma estrutura de dados simples que aceita todos os tipos de dados. Diferente do map ela não aceita chave valor e sim, diretamente o valor. Iniciamos sua declaração com abrir chaves { e finalizamos com fechar chaves }. Seus valores são separados por virgula.

Exemplo :

defmodule TupleTest do
  use ExUnit.Case

  test "simple tests about tuple" do
    int_value = 1
    atom_value = :ok
    map_value = %{name: "iago"}

    tuple = {int_value, atom_value, map_value, 10}

    assert tuple == {1, :ok, %{name: "iago"}, 10}
  end
end
mix test test/tuple_test.exs
.
Finished in 0.01 seconds (0.00s async, 0.01s sync)
1 test, 0 failures

Você verá muito pela comunidade elixir o padrão de utilização de tuplas para simbolizar sucesso de uma função, separando elas como {:ok, data} e {:error, reason}. Diversas bibliotecas utilizam esse mesmo padrão e é uma forma de aprender a lidar com os dados.

Ao lidar com tuplas, temos algumas funções para nos ajudar

Outro exemplo simples:

Tuplas também podem ter valores complexos como structures ou maps.

Utilização de tupla de :ok e :error em uma função

Vamos supor que faremos uma operação de cadastro em um fornecedor. Após a operação precisamos informar se a operação foi bem sucedida ou não. Para facilitar chamarei esse modulo de Vendor e a função de register. No registro precisamos apenas de um ID e uam descrição. Então passaremos dois parâmetros para a função. Queremos como retorno, a utilização de tuplas com :ok e :error chamado de error_handling (ou, tratamento de erro).

Conseguimos extrair o result utilizando pattern matching. O :ok garante que so poderá ter um matching caso venha um :ok no primeiro elemento da tupla.

Se rodarmos isso teremos os primeiros relatórios de erro

Precisamos criar nosso módulo com nossa função

O cenário feliz foi definido e tudo esta funcionando. Agora, precisamos também garantir o comportamento para a tupla com :error. Para isso iremos garantir que so possa ser enviado por parâmetro IDs do tipo inteiro.

Se rodarmos isso veremos que ele gera um novo erro para nós

Isso significa que nao foi encontrado uma função que atenda as espectativas dessa chamada. Devido a precisar ser inteiro e estarmos enviando String o código quebra.

Para resolver esse problema, precisamos criar uma nova função de mesmo nome que atenda a nova especificação. No nosso caso, criaremos uma apenas para informar que algo esta errado e retornar o :error.

Basta rodar e ver que agora temos o tratamento correto.

Conclusão

Tuplas são uma estrutura de dados simples onde guarda valores de todos os tipos. Vimos formas de utiliza-lo e algumas funções de apoio. Também demos uma olhada em um cenário comum que a tupla é utilizada.

Last updated

Was this helpful?