我在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"}
我已经尝试了其他一些方法来更新价值,但似乎没有任何工作。
答案 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"