Elixir - Estructuras

Las estructuras son extensiones creadas sobre mapas que proporcionan comprobaciones en tiempo de compilación y valores predeterminados.

Definición de estructuras

Para definir una estructura, se usa la construcción defstruct:

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

La lista de palabras clave utilizada con defstruct define qué campos tendrá la estructura junto con sus valores predeterminados. Las estructuras toman el nombre del módulo en el que están definidas. En el ejemplo anterior, definimos una estructura denominada Usuario. Ahora podemos crear estructuras de usuario usando una sintaxis similar a la que se usa para crear mapas:

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

El código anterior generará tres estructuras diferentes con valores:

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

Las estructuras proporcionan garantías en tiempo de compilación de que solo los campos (y todos ellos) definidos mediante defstruct podrán existir en una estructura. Por lo tanto, no puede definir sus propios campos una vez que haya creado la estructura en el módulo.

Acceder y actualizar estructuras

Cuando hablamos de mapas, mostramos cómo podemos acceder y actualizar los campos de un mapa. Las mismas técnicas (y la misma sintaxis) se aplican también a las estructuras. Por ejemplo, si queremos actualizar el usuario que creamos en el ejemplo anterior, entonces -

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)

Cuando se ejecuta el programa anterior, produce el siguiente resultado:

John
27

Para actualizar un valor en una estructura, usaremos nuevamente el mismo procedimiento que usamos en el capítulo del mapa,

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

Las estructuras también se pueden utilizar en la coincidencia de patrones, tanto para hacer coincidir el valor de claves específicas como para garantizar que el valor coincidente sea una estructura del mismo tipo que el valor coincidente.