アルパカログ

カスタマーサポート (CS) とエンジニアリングを掛け算したい CRE (Customer Reliability Engineer) が気になる技術や思ったことなど。

【Elixir】Mapにおけるkey-valueの更新・追加方法3つ

Elixir の map を更新する方法で、キーが存在する場合とキーが存在しない場合とで使える関数が違うので、備忘録を兼ねてまとめておきます。

Map は key-value ペアを持つデータ構造(連想配列)です。Ruby の Hash、Python の Dict をイメージするとわかりやすいでしょうか。

Elixir のデータ構造は immutable で、Map もその例外ではありません。

ですので Map の更新方法は少し特殊に感じるかもしれません。

既存の key-value ペアを更新するだけの方法と、key-value ペアが既存なら更新し、存在しなければ追加する方法をご紹介します。

キーが存在すれば更新する

この方法では key が存在しなければ KeyError が発生します。

map = %{hoge: "hoge", fuga: "fuga"}
new_map = %{map | fuga: "fugafuga"}
# %{fuga: "fugafuga", hoge: "hoge"}

キーが存在すれば更新し、存在しなければ追加する

Map.put を使う方法

# キーが存在する
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 を使う方法

# キーが存在する
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, Map.merge 共にキーの有無を気にしなくて良いので便利ですが、キーが存在しなければならないときに気が付かないという危険もあります。

そういうケースでは前述の更新のみに有効な方法を使うようにしましょう。

こちらもあわせて読みたい

alpacat.hatenablog.com