DEV Community

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

Posted on • Edited on

4 1

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.

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay