我正在学习一些关于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编译)
答案 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"}
希望这有帮助!