模式匹配以字符串为键的地图

时间:2016-08-09 05:58:57

标签: elixir

我创建了一个字符串为"2"的地图作为其中一个键:

iex(14)> map = %{:a => 1, "2" => 2, :b => 3}
%{:a => 1, :b => 3, "2" => 2}

现在我无法对其进行模式匹配。例如,如何获取与"2"关联的值?我尝试了以下但得到了以下错误:

iex(23)> %{a: c, "2" z} = map
** (SyntaxError) iex:23: syntax error before: "2"

iex(23)> %{a: c, "2": z} = map
** (MatchError) no match of right hand side value: %{:a => 1, :b => 3, "2" => 2}

2 个答案:

答案 0 :(得分:7)

您需要使用=>来匹配字符串键。

您可以对所有密钥使用=>

iex(1)> map = %{:a => 1, "2" => 2, :b => 3}
%{:a => 1, :b => 3, "2" => 2}
iex(2)> %{:a => c, "2" => z} = map
%{:a => 1, :b => 3, "2" => 2}
iex(3)> c
1
iex(4)> z
2

或使用:作为原子键(它们应该在=>键之后):

iex(5)> %{"2" => z, a: c} = map
%{:a => 1, :b => 3, "2" => 2}
iex(6)> z
2
iex(7)> c
1

答案 1 :(得分:4)

您必须记住,当您的密钥不是原子时,您无法使用语法a: value,但您必须明确使用地图语法:"a" => value

同样重要的是,您不能在atom之前使用=>语法,因此:

 %{:a =>  a,"2" => value} = map # perfectly valid, everywhere use =>
 %{"2" => value, a: a} = map  # perfectly valid, atom syntax after regular

但是这个是无效的:

 %{a: a, "2" => value} = map
 ** (SyntaxError) iex:5: syntax error before: "2"

我的建议:当将原子和字符串混合为清晰键时,请始终使用常规语法。