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

时间:2015-11-19 20:23:14

标签: 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:37: syntax error before: b

为什么?

修改

操作系统:Ubuntu 15.4

Elixir:1.1.1

2 个答案:

答案 0 :(得分:3)

根据my issue on Github(我实际上不应该打开),这不是错误。

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

  

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

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]的语法糖,但只是糖   当它在函数调用或“构造”结束时工作   %{}

答案 1 :(得分:0)

为了保持一致性?这就像用触发器和哥特靴子走路一样。你看起来很花哨,但仍然非常不方便。