错误模式匹配映射^键(带引脚的键)[Elixir]

时间:2018-06-14 06:11:34

标签: elixir

我正在学习一些关于elixir的教程

但是我在这个例子中找到解决方案时遇到了问题

nola = %{ name: "New Orleans", founded: 1718 }
field = "founded"
%{^field: city_founded} = nola
** (SyntaxError) iex:14: syntax error before: field


#I try with atom
field = :founded
%{^field: city_founded} = nola
** (SyntaxError) iex:15: syntax error before: field

#with Charlist
field = 'founded'
%{^field: city_founded} = nola 
** (SyntaxError) iex:16: syntax error before: field

在手册中它表明这是正确的,但它在我的手机中不起作用 IEx 1.6.5(使用OTP 19编译)

1 个答案:

答案 0 :(得分:2)

你非常接近!

请改为尝试:

nola = %{ name: "New Orleans", founded: 1718 }
field = :founded
%{^field => city_founded} = nola # pay atention to this line
city_founded => 1718

<强>解释

地图可以包含字符串或原子键,因此这些是有效的地图:

m1 = %{"my_key" => "foo"}
m2 = %{my_key: "foo"}

您可以访问以下值:

m1["my_key"] # => "foo"
m2[:my_key] # => "foo"

根据@ mudasobwa的建议,为了进一步澄清,字符串(或者更确切地说 - 二进制文件)不能与原子互换,因此如果使用错误,您将无法从地图中获取值:

m1[:my_key] # => nil
m2["my_key"] # => nil

这意味着一旦你将你的领域设置为原子:

field = :founded

您需要在与=>语法的模式匹配中使用它:

%{^field => city_founded} = nola

因为,如果您尝试使用:

的语法
%{^field: city_founded} = nola

它将无效 - 您的field已经是原子。

如果这进一步澄清,这两个例子是相同的:

%{my_key: "val1"}
%{"my_key": "val2"}
%{:my_key => "val3"}

希望这有帮助!