ElixirにおけるMapの更新方法は、対象のキーがある場合とない場合とで違います。
このエントリでは、キーの存在で異なるMapの更新方法を紹介します。
%{map | key: "value"}
のように、既存のキーを指定して更新します。
キーが存在しなければKeyError
が発生します。
# キーが存在する
map = %{hoge: "hoge", fuga: "fuga"}
new_map = %{map | fuga: "fugafuga"}
# => %{fuga: "fugafuga", hoge: "hoge"}
# キーが存在しない
map = %{hoge: "hoge"}
%{map | fuga: "fuga"}
# => ** (KeyError) key :fuga not found in: %{hoge: "hoge"}
キーが存在すれば更新し、存在しなければ追加する方法は2通りあります。
一つはMap.put/3
を使う方法で、もう一つはMap.merge/2,3
を使う方法です。
Map.put/3
では、第2、第3引数にキーと値を渡します。
# キーが存在する
map = %{hoge: "hoge", fuga: "fuga"}
map |> Map.put(:fuga, "fugafuga")
# => %{fuga: "fugafuga", hoge: "hoge"}
# キーが存在しない
map = %{hoge: "hoge"}
map |> Map.put(:fuga, "fuga")
# => %{fuga: "fuga", hoge: "hoge"}
Map.merge/2
では、第2引数に更新したいキーを持つMapを渡します。
# キーが存在する
map = %{hoge: "hoge", fuga: "fuga"}
map |> Map.merge(%{fuga: "fugafuga"})
# => %{fuga: "fugafuga", hoge: "hoge"}
# キーが存在しない
map = %{hoge: "hoge"}
map |> Map.merge(%{fuga: "fuga"})
# => %{fuga: "fuga", hoge: "hoge"}
Map.put/3
、Map.merge/2,3
の両方ともキーの存在を気にしなくて良いのは便利です。
しかし、「キーが存在しなければならない」ときに気が付かないという危険があります。
ユースケースによって使い分けましょう。
以上です。このエントリでは、キーの存在で異なるMapの更新方法を紹介しました。
コメントを送る
コメントはブログオーナーのみ閲覧できます