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