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

And*_*eko 6 elixir

定义地图有两种不同的语法:

map = %{:a => 1, :b => 2}
#=> %{a: 1, b: 2}
map = %{a: 1, b: 2}   
#=> %{a: 1, b: '2}
Run Code Online (Sandbox Code Playgroud)

在定义地图时使用以下两种方法:

map = %{:a => 1, b: 2}
#=> %{a: 1, b: 2}
Run Code Online (Sandbox Code Playgroud)

但在其他顺序中使用会抛出错误:

map = %{a: 1, :b => 2}
#=> ** (SyntaxError) iex:37: syntax error before: b
Run Code Online (Sandbox Code Playgroud)

为什么?

编辑

操作系统:Ubuntu 15.4

Elixir:1.1.1

And*_*eko 3

根据我在 Github 上的问题(我实际上不应该打开它),这不是一个错误。

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

这不是一个错误,它与函数最后一个参数上的关键字使用的语法糖相同。

foo(bar, baz: 0, boz: 1) #=> foo(bar, [baz: 0, boz: 1])
Run Code Online (Sandbox Code Playgroud)

映射语法在 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]}
Run Code Online (Sandbox Code Playgroud)

这就是为什么 map 关键字语法仅适用于最后一个(或唯一)参数。

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

简单的答案:b: 2是 的语法糖[b: 2],但该糖仅在函数调用或“构造”(例如 )结束时才起作用 %{}