Elixir语言中 Map
相关用法介绍如下。
Maps 是 Elixir 中的 "go to" 键值数据结构。
可以使用 %{}
语法创建映射,键值对可以表示为 key => value
:
iex> %{}
%{}
iex> %{"one" => :two, 3 => "four"}
%{3 => "four", "one" => :two}
映射中的键值对不遵循任何顺序(这就是为什么上面示例中的打印映射与创建的映射具有不同顺序的原因)。
Map 对键类型没有任何限制:任何东西都可以是 Map 中的键。作为键值结构,映射不允许重复键。使用 exact-equality 运算符 (
) 比较 key 。如果在映射文字中定义了冲突键,则以最后一个为准。===/2
当键值对中的键是原子时,可以使用 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
与包含一组预定原子键的映射一起使用,这些原子键预计将始终存在。通过
定义的结构是这种 "static maps" 的一个示例,其中的键也可以在编译时检查。defstruct/1
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
,在线性时间内运行,因为它们需要到达Map中的每个元素。values/1
Map还实现了
协议,因此在Enumerable
模块中可以找到许多与Map一起使用的函数。此外,在 Enum
中还可以找到以下Map函数:Kernel
相关用法
- Elixir Map.keys用法及代码示例
- Elixir Map.values用法及代码示例
- Elixir Map.update用法及代码示例
- Elixir MapSet用法及代码示例
- Elixir Map.split用法及代码示例
- Elixir MapSet.intersection用法及代码示例
- Elixir Map.put_new_lazy用法及代码示例
- Elixir Map.drop用法及代码示例
- Elixir Map.get用法及代码示例
- Elixir MapSet.member?用法及代码示例
- Elixir Map.new用法及代码示例
- Elixir Map.take用法及代码示例
- Elixir MapSet.size用法及代码示例
- Elixir Map.get_and_update!用法及代码示例
- Elixir Map.has_key?用法及代码示例
- Elixir MapSet.equal?用法及代码示例
- Elixir Map.replace用法及代码示例
- Elixir Map.update!用法及代码示例
- Elixir Map.from_struct用法及代码示例
- Elixir Map.reject用法及代码示例
- Elixir Map.delete用法及代码示例
- Elixir Map.to_list用法及代码示例
- Elixir MapSet.new用法及代码示例
- Elixir Map.equal?用法及代码示例
- Elixir Map.fetch!用法及代码示例
注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Map。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。