结构只是关于可用键的契约的映射。让我们定义一个结构。
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"}
如果结构有一组已定义的键,您可以更加确信您感兴趣的键是可用的。
但是,在很多情况下,您希望以其他方式使用地图。它们允许您进行更有效的查找,而不是在您想要查找某些内容时随时迭代列表。