这个elixir地图示例有什么问题?

Geo*_*Geo 3 elixir

根据我在网上找到的文章,我可以想象以下内容是可行的:

iex(9)> q
%{one: 1, two: 2}
iex(10)> nq = %{ q | three: 4}   
** (KeyError) key :three not found in: %{one: 1, two: 2}
    (stdlib) :maps.update(:three, 4, %{one: 1, two: 2})
    (stdlib) erl_eval.erl:255: anonymous fn/2 in :erl_eval.expr/5
    (stdlib) lists.erl:1262: :lists.foldl/3
iex(10)> nq = %{ q | :three => 4}
** (KeyError) key :three not found in: %{one: 1, two: 2}
    (stdlib) :maps.update(:three, 4, %{one: 1, two: 2})
    (stdlib) erl_eval.erl:255: anonymous fn/2 in :erl_eval.expr/5
    (stdlib) lists.erl:1262: :lists.foldl/3
Run Code Online (Sandbox Code Playgroud)

我试图在地图上添加一个新元素.谁能告诉我我做错了什么?我正在运行以下内容:

Erlang/OTP 18 [erts-7.2] [source-e6dd627] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Interactive Elixir (1.3.0-dev) - press Ctrl+C to exit (type h() ENTER for help)
Run Code Online (Sandbox Code Playgroud)

ham*_*ich 9

|是一个特定于地图的构造,提供更新和访问原子键的能力.因为它们不是:three关键%{one: 1, two: 2},它会给你一个错误.

你需要使用的是Map.put/3.

iex(1)> q = %{one: 1, two: 2}      
%{one: 1, two: 2}
iex(2)> q = Map.put(q, :three, 3)
%{one: 1, three: 3, two: 2}
Run Code Online (Sandbox Code Playgroud)

在这里,q与右侧(iex(2))重新匹配.

进一步

Simon St. Laurent和J. David Eisenberg在他们的书中介绍Elixir:功能编程入门.

您可能还想将另一个键值对添加到地图中.您当然不能自己更改地图,但Dict.put_new库函数可以轻松创建包含原始地图和额外值的新地图:

iex(1)> q = %{one: 1, two: 2} 
%{one: 1, two: 2}
iex(2)> Dict.put_new( q, :three, 3)
%{one: 1, three: 3, two: 2}
iex(3)> q = Dict.put_new( q, :three, 3)
Run Code Online (Sandbox Code Playgroud)

但是,即使它有效也应该避免使用Elixir 1.2,因为Dict + HashDict已被弃用.只需使用Map模块功能.