Elixir - Structs

Structs são extensões construídas sobre mapas que fornecem verificações de tempo de compilação e valores padrão.

Definindo Structs

Para definir uma estrutura, a construção defstruct é usada -

defmodule User do
   defstruct name: "John", age: 27
end

A lista de palavras-chave usada com defstruct define quais campos a estrutura terá junto com seus valores padrão. As estruturas recebem o nome do módulo em que são definidas. No exemplo dado acima, definimos uma estrutura chamada Usuário. Agora podemos criar estruturas de usuário usando uma sintaxe semelhante à usada para criar mapas -

new_john = %User{})
ayush = %User{name: "Ayush", age: 20}
megan = %User{name: "Megan"})

O código acima irá gerar três estruturas diferentes com valores -

%User{age: 27, name: "John"}
%User{age: 20, name: "Ayush"}
%User{age: 27, name: "Megan"}

As estruturas fornecem garantias em tempo de compilação de que apenas os campos (e todos eles) definidos por meio de defstruct terão permissão para existir em uma estrutura. Portanto, você não pode definir seus próprios campos depois de criar a estrutura no módulo.

Acessando e atualizando estruturas

Quando discutimos os mapas, mostramos como podemos acessar e atualizar os campos de um mapa. As mesmas técnicas (e a mesma sintaxe) se aplicam a estruturas também. Por exemplo, se quisermos atualizar o usuário que criamos no exemplo anterior, então -

defmodule User do
   defstruct name: "John", age: 27
end
john = %User{}
#john right now is: %User{age: 27, name: "John"}

#To access name and age of John, 
IO.puts(john.name)
IO.puts(john.age)

Quando o programa acima é executado, ele produz o seguinte resultado -

John
27

Para atualizar um valor em uma estrutura, usaremos novamente o mesmo procedimento que usamos no capítulo do mapa,

meg = %{john | name: "Meg"}

As estruturas também podem ser usadas na correspondência de padrões, tanto para combinar o valor de chaves específicas quanto para garantir que o valor correspondente seja uma estrutura do mesmo tipo que o valor correspondido.