2016-01-15 28 views
3

我會想象下面會工作的基礎上,文章我在網上找到:這個仙丹地圖的例子有什麼問題?

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 

我嘗試了新的元素添加到地圖中。 誰能告訴我我做錯了什麼?我運行如下:

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) 
+0

我猜我一直在尋找爲'Map.put/3'。有沒有更簡單的方法,就像一些特殊的操作員一樣? – Geo

+0

對不起,我現在只看到這個,並沒有在我的答案中解決這個問題!我認爲沒有,如果是的話,我從來沒有遇到過。 –

回答

9

|是地圖特定的結構,提供了能力更新和存取原子鍵。因爲%{one: 1, two: 2}中沒有:three鍵,所以會給你一個錯誤。

你需要使用的是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} 

這裏,q被重新匹配用右手側(IEX(2))。

而且

西蒙·聖·洛朗& J.大衛·艾森伯格在他們的書中介紹藥劑:入門函數式編程。

您可能還想要將另一個鍵值對添加到地圖。你不能 當然,改變地圖intself,但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) 

然而,儘管它的工作原理這應該避免使用Elixir 1.2,因爲Dict + HashDict has been deprecated。只需使用地圖模塊功能即可。

1

不是你問什麼,但想到我會發佈一個辦法(我的猜測是足夠短),以擴大在這個與幾個地圖的工作:

iex(1)> q = %{one: 1, two: 2} 
%{one: 1, two: 2} 
iex(2)> b = %{three: 3, four: 4} 
%{four: 4, three: 3} 
iex(3)> Enum.reduce([q, b, %{five: 5}], &Map.merge/2) 
%{five: 5, four: 4, one: 1, three: 3, two: 2}