定义地图有两种不同的语法:
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
根据我在 Github 上的问题(我实际上不应该打开它),这不是一个错误。
第一个答案(我没有真正得到):
这不是一个错误,它与函数最后一个参数上的关键字使用的语法糖相同。
Run Code Online (Sandbox Code Playgroud)foo(bar, baz: 0, boz: 1) #=> foo(bar, [baz: 0, boz: 1])映射语法在 AST 中表示为函数调用:
Run Code Online (Sandbox Code Playgroud)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],但该糖仅在函数调用或“构造”(例如 )结束时才起作用%{}。
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |