Структуры - это просто карты с договором о том, какие ключи доступны. Давайте определим структуру.
iex> defmodule Alpha do
...> defstruct [:a, :b, :c]
...> end
Тогда давайте использовать ее:
iex> %Alpha{a: 3, b: 4, c: 5}
%Alpha{a: 3, b: 4, c: 5}
Давайте создадим похожую карту:
iex> %{a: 3, b: 4, c: 5}
%{a: 3, b: 4, c: 5}
Если мы просто добавим :__struct__
ключ, мы неожиданно получаем структуру:
iex> %{__struct__: Alpha, a: 3, b: 4, c: 5}
%Alpha{a: 3, b: 4, c: 5}
Синтаксис .
доступен для любой карты с ключами атома:
iex> user = %{name: "Brett"}
%{name: "Brett"}
iex> user.name
"Brett"
Но если вы используете его для ключа, нена карте вы получите сообщение об ошибке:
iex> user.age
** (KeyError) key :age not found in: %{name: "Brett"}
Если структуры имеют определенный набор ключей, вы можете быть намного увереннее, что ключ, который вас интересует, доступен.
Однако, существует множество ситуаций, когда вы хотите использовать карты другими способами. Они позволяют вам гораздо более эффективный поиск, чем повторение списка в любое время, когда вы хотите что-то найти.