2017-02-21 13 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.fooを使用して、新しい値にアクセスしたい場合はmapに新しいマップを割り当てる必要があります:

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

あなたがしようとした場合REPLでの動作はまったく同じです2行目の入力後にmap.fooを印刷する:

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" 
関連する問題