往Elixir里的Map塞东西

Elixir的Map模块提供了一些不同的函数来操作map数据结构。其中一个函数就是Map.put/3 。这个函数允许你将一个健值对放入一个map中。

1
2
3
4
5
6
> pokemon = %{charmander: 22}
%{charmander: 22}
> pokemon = Map.put(pokemon, :squirtle, 9)
%{charmander: 22, squirtle: 9}
> pokemon = Map.put(pokemon, :squirtle, 10)
%{charmander: 22, squirtle: 10}

如果这个键对于此map来说是新的话,这个键值对就简单地加入map。如果这个键对于此map来说是已存在的,那么对应的老的值则被新的值替换。

同样的效果可以用Map.merge/2来实现。

1
2
3
4
5
6
7
8
9
10
> pokemon = %{charmander: 22}
%{charmander: 22}
> Map.merge(pokemon, %{squirtle: 9})
%{charmander: 22, squirtle: 9}
> pokemon = Map.merge(pokemon, %{squirtle: 9})
%{charmander: 22, squirtle: 9}
> pokemon = Map.merge(pokemon, %{squirtle: 10})
%{charmander: 22, squirtle: 10}
> pokemon = Map.merge(pokemon, %{squirtle: 11, bulbasaur: 14})
%{bulbasaur: 14, charmander: 22, squirtle: 11}

Map.merge/2的优势是它的灵活性。它能够更容易地在不同情况下使用。它甚至允许一次增加并且替换多个健值对。因为两个入参都是map,它让我们感觉到更容易阅读。

也有一个语法糖的方法,就是用map字面符号和一个管道来替换已经存在的键值对。

1
2
3
4
> pokemon = %{charmander: 22, squirtle: 9}
%{charmander: 22, squirtle: 9}
> pokemon = %{pokemon | squirtle: 10}
%{charmander: 22, squirtle: 10}

这个是最简洁的方法,但是,它仅仅是用来替换一个健值对。如果这个键不存在map中,则一个错误将发生。

除此之外当然还有其他函数来设置值到map中,包括 Kernel.put_in/3Map.get_and_update/3 。然而上述几个方法是我自己最经常接触到的。

原文链接: http://joshbranchaud.com/2016/09/25/putting-things-into-maps-in-elixir/