アルパカログ

Webエンジニア兼マネージャーがプログラミングやマネジメント、読んだ本のまとめを中心に書いてます。

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

f:id:otoyo0122:20200819225247p:plain:w300

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の更新方法を紹介しました。

参考になった方は、ぜひ「はてブ」やSNSでシェアしていただけると嬉しいです。

他のElixirのエントリも見る

このブログでは他にもElixirのエントリを書いています。興味のある方は下記からご覧ください。

alpacat.hatenablog.com