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

ank*_*981 2 elixir

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

iex(14)> map = %{:a => 1, "2" => 2, :b => 3}
%{:a => 1, :b => 3, "2" => 2}
Run Code Online (Sandbox Code Playgroud)

现在我无法进行模式匹配.例如,我如何获得与之关联的值"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}
Run Code Online (Sandbox Code Playgroud)

Dog*_*ert 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
Run Code Online (Sandbox Code Playgroud)

:用于原子键(它们应该在=>键之后):

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


Pat*_*wak 4

你必须记住,当你的键不是原子时,你不能使用语法a: value,但你必须显式使用映射语法:"a" => value

另外重要的是你不能使用atombefore 语法=>,所以:

 %{:a =>  a,"2" => value} = map # perfectly valid, everywhere use =>
 %{"2" => value, a: a} = map  # perfectly valid, atom syntax after regular
Run Code Online (Sandbox Code Playgroud)

但这是无效的:

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

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