我创建了一个字符串为"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}
答案 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"
我的建议:当将原子和字符串混合为清晰键时,请始终使用常规语法。