Elixir - Structs
Struktury to rozszerzenia zbudowane na podstawie map, które zapewniają kontrolę w czasie kompilacji i wartości domyślne.
Definiowanie struktur
Aby zdefiniować strukturę, używana jest konstrukcja defstruct -
defmodule User do
defstruct name: "John", age: 27
end
Lista słów kluczowych używana z defstruct definiuje, jakie pola będzie miała struktura wraz z ich wartościami domyślnymi. Struktury przyjmują nazwę modułu, w którym są zdefiniowane. W powyższym przykładzie zdefiniowaliśmy strukturę o nazwie User. Możemy teraz tworzyć struktury użytkownika, używając składni podobnej do tej używanej do tworzenia map -
new_john = %User{})
ayush = %User{name: "Ayush", age: 20}
megan = %User{name: "Megan"})
Powyższy kod wygeneruje trzy różne struktury z wartościami -
%User{age: 27, name: "John"}
%User{age: 20, name: "Ayush"}
%User{age: 27, name: "Megan"}
Struktury zapewniają czas kompilacji gwarancje, że tylko pola (i wszystkie z nich) zdefiniowane przez defstruct będą mogły istnieć w strukturze. Nie możesz więc definiować własnych pól po utworzeniu struktury w module.
Dostęp i aktualizacja struktur
Kiedy omawialiśmy mapy, pokazaliśmy, jak możemy uzyskać dostęp do pól mapy i zaktualizować je. Te same techniki (i ta sama składnia) mają również zastosowanie do struktur. Na przykład, jeśli chcemy zaktualizować użytkownika, którego utworzyliśmy we wcześniejszym przykładzie, to -
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)
Uruchomienie powyższego programu daje następujący wynik -
John
27
Aby zaktualizować wartość w strukturze, ponownie użyjemy tej samej procedury, której użyliśmy w rozdziale dotyczącym mapy,
meg = %{john | name: "Meg"}
Struktur można również używać do dopasowywania wzorców, zarówno do dopasowywania wartości określonych kluczy, jak i do zapewniania, że dopasowana wartość jest strukturą tego samego typu, co dopasowana wartość.