Структуры — это расширения, построенные поверх карт, которые обеспечивают проверки во время компиляции и значения по умолчанию.
Определение структур
Для определения структуры используется конструкция 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"}
Структуры также могут использоваться при сопоставлении с образцом, как для сопоставления по значению конкретных ключей, так и для обеспечения того, чтобы сопоставляемое значение представляло собой структуру того же типа, что и сопоставляемое значение.