Elisir - Struct

Le strutture sono estensioni costruite sopra le mappe che forniscono controlli in fase di compilazione e valori predefiniti.

Definizione di strutture

Per definire una struttura, viene utilizzato il costrutto defstruct:

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

L'elenco di parole chiave utilizzato con defstruct definisce quali campi avrà la struttura insieme ai valori predefiniti. Le strutture prendono il nome del modulo in cui sono definite. Nell'esempio dato sopra, abbiamo definito una struttura chiamata Utente. Ora possiamo creare strutture utente usando una sintassi simile a quella usata per creare mappe -

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

Il codice sopra genererà tre diverse strutture con valori:

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

Le strutture forniscono garanzie in fase di compilazione che solo i campi (e tutti loro) definiti tramite defstruct potranno esistere in una struttura. Quindi non puoi definire i tuoi campi una volta che hai creato la struttura nel modulo.

Accesso e aggiornamento di Struct

Quando abbiamo discusso delle mappe, abbiamo mostrato come possiamo accedere e aggiornare i campi di una mappa. Le stesse tecniche (e la stessa sintassi) si applicano anche alle strutture. Ad esempio, se vogliamo aggiornare l'utente che abbiamo creato nell'esempio precedente, allora:

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 il programma di cui sopra viene eseguito, produce il seguente risultato:

John
27

Per aggiornare un valore in una struttura, useremo di nuovo la stessa procedura che abbiamo usato nel capitolo della mappa,

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

Le strutture possono essere utilizzate anche nella corrispondenza dei modelli, sia per la corrispondenza sul valore di chiavi specifiche, sia per garantire che il valore corrispondente sia una struttura dello stesso tipo del valore corrispondente.