2017-02-21 144 views
0

藥劑映射值我寫了藥劑的功能,創建一個地圖,然後試圖改變它的按鍵之一的價值,但它似乎並沒有要更新。沒有更新

defmodule KV do 
    def test() do 
     map = %{foo: "bar", hello: "world"} 
     IO.inspect map.foo 
     %{map | foo: "baz"} 
     IO.inspect map.foo 
    end 
end 

KV.test() 

我希望編譯代碼後出現的是:

"bar" 
"baz" 

但我實際得到的是:

"bar" 
"bar" 

然而,當我試圖只是打字它iex外殼它做它應該做的事情:

iex(1)> map = %{foo: "bar", hello: "world"} 
%{foo: "bar", hello: "world"} 
iex(2)> %{map | foo: "baz"} 
%{foo: "baz", hello: "world"} 

我已經嘗試了一些其他的方法來更新值,但似乎沒有奏效。

回答

6

藥劑地圖是不可改變的。 %{map | foo: "baz"}創建更新後的值新的地圖,但你需要新的地圖分配給map,如果你想使用map.foo訪問新的價值:

map = %{foo: "bar", hello: "world"} 
IO.inspect map.foo 
map = %{map | foo: "baz"} 
IO.inspect map.foo 

在REPL的行爲是完全一樣的,如果你嘗試

iex(1)> map = %{foo: "bar", hello: "world"} 
%{foo: "bar", hello: "world"} 
iex(2)> map.foo 
"bar" 
iex(3)> %{map | foo: "baz"} 
%{foo: "baz", hello: "world"} 
iex(4)> map.foo 
"bar" 
iex(5)> map = %{map | foo: "baz"} 
%{foo: "baz", hello: "world"} 
iex(6)> map.foo 
"baz" 
:您輸入的第二行後打印 map.foo