2017-02-21 3 views
0

Aktualisierung schrieb ich eine Funktion in Elixir, das eine Karte erstellt dann versucht, den Wert eines seiner Schlüssel zu ändern, aber es scheint nicht aktualisieren zu wollen.Elixir Karte Wert nicht

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() 

Was erwarte ich nach erscheinen Kompilieren des Codes ist dies:

"bar" 
"baz" 

Aber was ich tatsächlich bekommen, ist dies:

"bar" 
"bar" 

aber als ich versuchte, die Eingabe es nur auf die iex shell es tut was es tun soll:

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

Ich habe eine Reihe von anderen Methoden versucht, den Wert zu aktualisieren, aber nichts scheint zu funktionieren.

Antwort

6

Elixir Karten sind unveränderlich. %{map | foo: "baz"} eine neue Map mit dem aktualisierten Wert, aber Sie müssen die neue Karte zu map zuweisen, wenn Sie den neuen Wert mit map.foo zugreifen möchten:

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

Das Verhalten in der REPL ist genau das gleiche, wenn Sie versuchen, zu drucken map.foo nach Ihrer zweiten Zeile der Eingabe:

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" 
Verwandte Themen