2017-02-21 105 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