Elixir地图值未更新

时间:2017-02-21 05:15:46

标签: elixir

我在Elixir中编写了一个函数,创建了一个地图,然后尝试更改其中一个键的值,但它似乎并不想更新。

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 shell上输入它时,它会做它本应该做的事情:

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

我已经尝试了其他一些方法来更新价值,但似乎没有任何工作。

1 个答案:

答案 0 :(得分:7)

Elixir地图是不可变的。 %{map | foo: "baz"}使用更新后的值创建新地图,但如果您想使用map访问新值,则需要将新地图分配给map.foo

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

如果您尝试在第二行输入后打印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"