アルパカログ

Elixir キーの存在で異なるMapの更新方法

2018年8月06日
🔖Elixir🔖プログラミング

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 を使う方法

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 を使う方法

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/3Map.merge/2,3の両方ともキーの存在を気にしなくて良いのは便利です。

しかし、「キーが存在しなければならない」ときに気が付かないという危険があります。

ユースケースによって使い分けましょう。

以上です。このエントリでは、キーの存在で異なるMapの更新方法を紹介しました。

タグ