我创建了一个以字符串"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)
您需要使用=>匹配字符串键.
您可以使用=>所有键:
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)
你必须记住,当你的键不是原子时,你不能使用语法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)
我的建议:为了清晰起见,将原子和字符串混合作为键时,始终使用常规语法。
| 归档时间: |
|
| 查看次数: |
1348 次 |
| 最近记录: |