Учебники

Эликсир — Структуры

Структуры — это расширения, построенные поверх карт, которые обеспечивают проверки во время компиляции и значения по умолчанию.

Определение структур

Для определения структуры используется конструкция defstruct —

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

Список ключевых слов, используемых с defstruct, определяет, какие поля будут иметь структура вместе со значениями по умолчанию. Структуры берут имя модуля, в котором они определены. В приведенном выше примере мы определили структуру с именем User. Теперь мы можем создавать пользовательские структуры, используя синтаксис, аналогичный тому, который используется для создания карт —

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

Приведенный выше код сгенерирует три различных структуры со значениями:

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

Структуры предоставляют гарантии времени компиляции, что только поля (и все они), определенные с помощью defstruct, могут существовать в структуре. Таким образом, вы не можете определить свои собственные поля после того, как создали структуру в модуле.

Доступ и обновление структур

Когда мы обсуждали карты, мы показали, как мы можем получить доступ и обновить поля карты. Те же методы (и тот же синтаксис) применимы и к структурам. Например, если мы хотим обновить пользователя, которого мы создали в предыдущем примере, то —

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)

Когда вышеуказанная программа запущена, она дает следующий результат —

John
27

Чтобы обновить значение в структуре, мы снова будем использовать ту же процедуру, что мы использовали в главе карты,

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

Структуры также могут использоваться при сопоставлении с образцом, как для сопоставления по значению конкретных ключей, так и для обеспечения того, чтобы сопоставляемое значение представляло собой структуру того же типа, что и сопоставляемое значение.