根据我在网上找到的文章,我可以想象以下内容是可行的:
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)
这|
是一个特定于地图的构造,提供更新和访问原子键的能力.因为它们不是: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模块功能.