当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Map用法及代码示例


Elixir语言中 Map 相关用法介绍如下。

Maps 是 Elixir 中的 "go to" 键值数据结构。

可以使用 %{} 语法创建映射,键值对可以表示为 key => value

iex> %{}
%{}
iex> %{"one" => :two, 3 => "four"}
%{3 => "four", "one" => :two}

映射中的键值对不遵循任何顺序(这就是为什么上面示例中的打印映射与创建的映射具有不同顺序的原因)。

Map 对键类型没有任何限制:任何东西都可以是 Map 中的键。作为键值结构,映射不允许重复键。使用 exact-equality 运算符 ( ===/2 ) 比较 key 。如果在映射文字中定义了冲突键,则以最后一个为准。

当键值对中的键是原子时,可以使用 key: value 速记语法(与许多其他特殊形式一样):

iex> %{a: 1, b: 2}
%{a: 1, b: 2}

如果您想将速记语法与 => 混合使用,则速记语法必须位于末尾:

iex> %{"hello" => "world", a: 1, b: 2}
%{:a => 1, :b => 2, "hello" => "world"}

Map中的键可以通过此模块中的某些函数(例如 Map.get/3 Map.fetch/2 )或通过 Access 模块提供的 map[] 语法访问:

iex> map = %{a: 1, b: 2}
iex> Map.fetch(map, :a)
{:ok, 1}
iex> map[:b]
2
iex> map["non_existing_key"]
nil

要访问原子键,也可以使用map.key 表示法。请注意,如果 map 不包含键 :key ,则 map.key 将引发 KeyError ,而 map[:key] 将返回 nil

map = %{foo: "bar", baz: "bong"}
map.foo
#=> "bar"
map.non_existing_key
** (KeyError) key :non_existing_key not found in: %{baz: "bong", foo: "bar"}

注意:访问字段时不要添加括号,例如在 data.key() 中。如果使用括号,Elixir 将期望 data 是表示模块的原子,并尝试在其中调用 function key/0

访问键的两种语法揭示了映射的双重性质。 map[key] 语法用于动态创建的可能具有任何类型的任何键的映射。 map.key 与包含一组预定原子键的映射一起使用,这些原子键预计将始终存在。通过 defstruct/1 定义的结构是这种 "static maps" 的一个示例,其中的键也可以在编译时检查。

Map可以进行模式匹配。当映射位于模式匹配的左侧时,如果右侧的映射包含左侧的键并且它们的值与左侧的值匹配,它将匹配。这意味着空Map匹配每张Map。

iex> %{} = %{foo: "bar"}
%{foo: "bar"}
iex> %{a: a} = %{:a => 1, "b" => 2, [:c, :e, :e] => 3}
iex> a
1

但这会引发 MatchError 异常:

%{:c => 3} = %{:a => 1, 2 => :b}

在编写映射文字以及匹配时,变量都可以用作映射键:

iex> n = 1
1
iex> %{n => :one}
%{1 => :one}
iex> %{^n => :one} = %{1 => :one, 2 => :two, 3 => :three}
%{1 => :one, 2 => :two, 3 => :three}

Maps 还支持特定的更新语法来更新存储在 existing 原子键下的值:

iex> map = %{one: 1, two: 2}
iex> %{map | one: "one"}
%{one: "one", two: 2}

当映射中不存在的键被更新时,将引发 KeyError 异常:

%{map | three: 3}

该模块中需要查找特定键的函数在对数时间内工作。这意味着查找键所需的时间随着Map的增长而增长,但它与Map大小不成正比。与在列表中查找元素相比,它的性能更好,因为列表具有线性时间复杂度。一些函数,例如 keys/1 values/1 ,在线性时间内运行,因为它们需要到达Map中的每个元素。

Map还实现了 Enumerable 协议,因此在 Enum 模块中可以找到许多与Map一起使用的函数。此外,在 Kernel 中还可以找到以下Map函数:

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Map。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。