在Elixir中,为什么在创建地图时不能使用不同的符号?

在Elixir中,为什么在创建地图时不能使用不同的符号?,elixir,Elixir,定义映射有两种不同的语法: map = %{:a => 1, :b => 2} #=> %{a: 1, b: 2} map = %{a: 1, b: 2} #=> %{a: 1, b: '2} 在定义地图时,按如下方式使用这两种方法: map = %{:a => 1, b: 2} #=> %{a: 1, b: 2} 但按其他顺序使用会引发错误: map = %{a: 1, :b => 2} #=> ** (SyntaxError) iex

定义映射有两种不同的语法:

map = %{:a => 1, :b => 2}
#=> %{a: 1, b: 2}
map = %{a: 1, b: 2}   
#=> %{a: 1, b: '2}
在定义地图时,按如下方式使用这两种方法:

map = %{:a => 1, b: 2}
#=> %{a: 1, b: 2}
但按其他顺序使用会引发错误:

map = %{a: 1, :b => 2}
#=> ** (SyntaxError) iex:37: syntax error before: b
为什么?

编辑 操作系统:Ubuntu 15.4


长生不老药:1.1.1

也许是为了一致性?这就像穿着人字拖和哥特靴走路。你可能看起来很花哨,但仍然非常不方便。

根据(实际上我不应该打开),这不是一个bug

第一个答案(我没有真正得到):

这不是一个bug,它与用于关键字的语法相同 函数的最后一个参数

foo(bar, baz: 0, boz: 1) #=> foo(bar, [baz: 0, boz: 1])
映射语法在AST中表示为函数调用:

iex(1)> quote do: foo(bar, baz: 0, boz: 1)
{:foo, [], [{:bar, [], Elixir}, [baz: 0, boz: 1]]}
iex(2)> quote do: %{baz: 0, boz: 1}
{:%{}, [], [baz: 0, boz: 1]}
这就是为什么map关键字语法只适用于最后一个(或仅适用于) 争论

第二个答案,从某种意义上说,听起来还行,我想我明白了:

简单回答:
b:2
[b:2]
的语法糖,但只是糖 在函数调用或“构造”结束时工作,如
%{}


这可能是Elixir中的错误。您可能需要添加一些详细信息。长生不老药、操作系统等的版本。