定义地图有两种不同的语法:
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
答案 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)
为了保持一致性?这就像用触发器和哥特靴子走路一样。你看起来很花哨,但仍然非常不方便。