不推荐使用Dict.merge,将关键字列表与Map合并的最简单方法是什么?

时间:2017-01-14 13:40:36

标签: elixir

从Elixir v1.2开始,Dict模块已被软推弃。我们现在处于1.4,它会引发警告:

  

不推荐使用Dict.merge / 2,使用Map模块处理地图或使用Keyword模块处理关键字列表

Dict.merge曾经像这样工作:

iex(1)> animals_keyword_list = [cats: 2, dogs: 1]
[cats: 2, dogs: 1]
iex(2)> animals_map = %{cats: 3, rabbits: 1}
%{cats: 3, rabbits: 1}
iex(3)> Dict.merge(animals_map, animals_keyword_list)
%{cats: 2, dogs: 1, rabbits: 1}

处理简单关键字列表的最佳方法是什么?>地图合并前进?

3 个答案:

答案 0 :(得分:10)

MapKeyword都实施了EnumerableCollectable协议,因此我们可以使用Enum.into/2

iex(4)> animals_keyword_list |> Enum.into(animals_map)
%{cats: 2, dogs: 1, rabbits: 1}

请注意,此解决方案要求您高兴的是,如果关键字列表中存在重复的键,则声明的最后一个键将覆盖之前的任何键,因为Maps不能具有重复键。当您反过来并将Map合并到关键字列表中时,您可以看到这一点,该关键字列表可以支持重复键:

iex(5)> animals_map |> Enum.into(animals_keyword_list)
[cats: 2, dogs: 1, cats: 3, rabbits: 1]

答案 1 :(得分:2)

而不是Map.merge/2,您只需使用map1 = %{name: "bob"} map2 = %{name: "fred", wife: "wilma"} Map.merge(map1, map2) # %{name: "fred", wife: "wilma"}

Keyword.merge/2

关键字列表的相同规则并使用Map.merge/2

在您的示例中,我会将Enum.intoMap.merge(animal_map, Enum.into(animal_keyword_list, %{})) 用于关键字列表。

Map

或仅使用Map.merge(animal_map, Map.new(animal_keyword_list)) 模块:

X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff

答案 2 :(得分:0)

Keyword.merge是完美的解决方案,例如

iex> Keyword.merge([a: 1, b: 2], [a: 3, d: 4])
[b: 2, a: 3, d: 4]