DEV Community

Elixir UTFPR (por Adolfo Neto)
Elixir UTFPR (por Adolfo Neto)

Posted on • Updated on

Como usar o Módulo Tuple em Elixir?

Alt Text

Texto anterior: Como começar a aprender a linguagem de programação Elixir?

Todos que conhecem Elixir devem conhecer a tupla, uma estrutura de dados que permite você juntar valores de diferentes tipos, sejam estes valores de tipos básicos ou não básicos.

Para criar uma tupla, basta abrir uma chave "{", listar os valores separados por vírgulas, e fechar a chave "}".

Exemplos:

{"Adolfo", "UTFPR", 2008}
{:idade, 25, :peso, 60.5}
{true, [:p, :implies, :q]} 
Enter fullscreen mode Exit fullscreen mode

Não gosto muito da definição da Elixir School nem da definição do site da linguagem, então vou dar a definição do Dave Thomas em Programming Elixir: tuplas são coleções ordenadas de valores. Ele reforça que "como todas as estruturas de dados em Elixir, uma vez criada uma tupla não pode ser modificada".

Qual é a forma mais comum de obter valores de tuplas? Fazendo casamento de padrões. No exemplo abaixo, se sabemos que a tupla contém quatro valores, dos quais o primeiro e o terceiro são os átomos :idade e :peso, e o segundo e o quarto são a idade e o peso da pessoa, podemos fazer assim para obter idade e peso:

iex> pessoa = {:idade, 25, :peso, 60.5}
{:idade, 25, :peso, 60.5}
iex> {:idade, idade, :peso, peso} = pessoa
{:idade, 25, :peso, 60.5}
iex> idade
25
iex> peso
60.5

Enter fullscreen mode Exit fullscreen mode

OK, então onde entra o módulo Tuple e o que podemos fazer com ele?
Segundo a documentação, no módulo Tuple você tem "Funções para trabalhar com tuplas." Meio óbvio, né?

Eu confesso que nem sabia da existência deste módulo até alguém perguntar por tuplas no Discord da Groxio Learning:
Alt Text

A própria documentação do módulo avisa: "As funções neste módulo que adicionam e removem elementos de tuplas raramente são usadas na prática, pois geralmente implicam que tuplas estão sendo usadas como coleções."

O módulo Tuple (na versão 1.11.1 de Elixir) tem apenas 5 funções:

  • append(tupla, valor): Insere um elemento no fim de uma tupla.
  • delete_at(tupla, índice): Remove um elemmento de uma tupla.
  • duplicate(dado, tamanho): Cria uma nova tupla.
  • insert_at(tupla, índice, valor): Insere um elemento em uma tupla.
  • to_list(tupla): Converte uma tupla em uma lista.

Abaixo algumas interações na iex do Elixir usando as funções acima:

iex> pessoa = {:idade, 25, :peso, 60.5}
{:idade, 25, :peso, 60.5}
iex> Tuple.append(pessoa, "João")
{:idade, 25, :peso, 60.5, "João"}
iex> Tuple.delete_at(pessoa, 3)
{:idade, 25, :peso}
iex> Tuple.duplicate(:elixir, 5)
{:elixir, :elixir, :elixir, :elixir, :elixir}
iex> Tuple.insert_at(pessoa, 4, "João")
{:idade, 25, :peso, 60.5, "João"}
iex> Tuple.insert_at(pessoa, 3, "João")
{:idade, 25, :peso, "João", 60.5}
iex> Tuple.to_list(pessoa)
[:idade, 25, :peso, 60.5]
Enter fullscreen mode Exit fullscreen mode

Como você pode ver acima, o primeiro elemento de uma tupla tem índice 0.

Vocês também podem usar, como tuplas, três funções que não são do módulo Tuple:

  • tuple_size(tupla): retorna o tamanho de uma tupla.
  • elem(tupla, índice): retorna o elemento na posição índice da tupla.
  • put_elem(tupla, índice, valor): coloca o valor na posição dada por índice na tupla.

Exemplos:

iex> pessoa = {:idade, 25, :peso, 60.5}
{:idade, 25, :peso, 60.5}
iex> tuple_size(pessoa)
4
iex> elem(pessoa,1)
25
iex> elem(pessoa,0)
:idade
iex> put_elem(pessoa,0, "oi")
{"oi", 25, :peso, 60.5}
Enter fullscreen mode Exit fullscreen mode

Na página da linguagem há uma discussão um pouco mais avançada sobre a diferença entre listas e tuplas.

Portanto, o conselho é: usem tuplas mas evitem usar o módulo Tuple.

Top comments (0)