如何在 Elixir 映射中添加(和删除)键值对?这不起作用:
map = %{a: 1, b: 2, c: 3}
map[:d] = 4
Map.put(map, key, value)
:
map = Map.put(map, :d, 4)
#=> %{a: 1, b: 2, c: 3, d: 4}
Map.delete(map, key)
:
map = Map.delete(map, :b)
#=> %{a: 1, c: 3}
所以下面的代码没有意义,因为你不能像这样直接改变
map
或 map[:d]
的值:
map[:d] = 4
以下是您可以使用的功能:
Map.put(map, key, value)
将元素添加到地图
Map.delete(map, key)
从地图中删除元素
由于 Elixir 变量是不可变的,这些函数返回一个新的映射,而不是直接更改你的映射。示例:
iex(1)> map = %{a: 1, b: 2, c: 3}
%{a: 1, b: 2, c: 3}
iex(2)> Map.put(map, :d, 4)
%{a: 1, b: 2, c: 3, d: 4}
iex(3)> map
%{a: 1, b: 2, c: 3} # map is unchanged
因此,如果您想“更改”地图,则需要用
map
或 Map.put()
返回的新地图替换旧的 Map.delete()
变量。示例:
iex(1)> map = %{a: 1, b: 2, c: 3}
%{a: 1, b: 2, c: 3}
iex(2)> map = Map.put(map, :d, 4)
%{a: 1, b: 2, c: 3, d: 4}
iex(3)> map = Map.delete(map, :a)
%{b: 2, c: 3, d: 4}
Enumerable
键值对,则可以使用 Map.new/1
创建新映射:
iex> values = [a: 1, b: 2, c: 3]
[a: 1, b: 2, c: 3]
iex> Map.new(values)
%{a: 1, b: 2, c: 3}
Collectable
协议,因此您可以使用 Enum.into/2
:
iex> map = %{existing: "value"}
%{existing: "value"}
iex> Enum.into(values, map)
%{a: 1, b: 2, c: 3, existing: "value"}
或者使用 理解:
iex> for {k, v} <- values, into: map, do: {k, v}
%{a: 1, b: 2, c: 3, existing: "value"}
Map.drop/2
:
iex> map = %{a: 1, b: 2, c: 3, d: 4, e: 5}
%{a: 1, b: 2, c: 3, d: 4, e: 5}
iex> Map.drop(map, [:a, :c])
%{b: 2, d: 4, e: 5}