闘魂Elixir ── 14. Map.merge

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>

https://qiita.com/advent-calendar/2022

https://qiita.com/advent-calendar/2022/elixir

# はじめに

闘魂と[Elixir](https://elixir-lang.org/)が出会いました。
闘魂 meets [Elixir](https://elixir-lang.org/).です。
[Elixir](https://elixir-lang.org/) meets 闘魂.でもよいです。

本日は、[Map.merge/3](https://hexdocs.pm/elixir/Map.html#merge/3)を説明します。

```elixir
iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}
```

# [Map.merge/3](https://hexdocs.pm/elixir/Map.html#merge/3)

2つのマップをマージします。
マップとはキーと値のアレです。はてな？　の方は、「[闘魂Elixir ── 11. Mapモジュール](https://qiita.com/torifukukaiou/items/2421ccca8784e192ebac)」をご覧になってください。

もしも両方のマップに同じキーが含まれている場合は、第3引数に指定した関数で裁定します。レフェリーです。
第3引数の関数は３つの引数をとります。先頭から、キー、先頭Mapの値、後続Mapの値となります。


こちらの図[^1]をみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/3e313a6e-2544-50bb-6827-864fa66b4720.png)



なかなか複雑ですね。説明します。
`%{a: 1, b:2}`と`%{a: 3, d: 4}`という2つのMapをマージしています。
キー`:a`は両方のマップに含まれています。ですからどうやってマージすればよいか指定してあげる必要があります。
重複するキーがあった場合に値をどのように決めるか、つまりどのように裁定をするのかを関数で第3引数で指定します。ここではこの関数のことを裁定（レフェリー）関数と呼びます。
この裁定（レフェリー）関数は、3つの引数をとります。先頭から、キー、先頭Mapの値、後続Mapの値となります。
ここでの裁定の仕方は足し算（和）としているわけです。

説明はこのくらいにしておきます。
さっそく動かしてみましょう。



[^1]: 図は、https://excalidraw.com/ を使って作成しています。スゴ腕ハッカーが書いたかのような手書き風の絵が書けるので最近の私のお気に入りツールです。



[IEx](https://hexdocs.pm/iex/IEx.html)で確かめてみましょう。

```:CMD
iex
```

[IEx](https://hexdocs.pm/iex/IEx.html)が立ち上がったら、以下のプログラムを実行してみてください。

```elixir
iex> f = fn _k, v1, v2 -> v1 + v2 end

iex> Map.merge(%{a: 1, b: 2}, %{a: 3, d: 4}, f)
%{a: 4, b: 2, d: 4}
```

`%{a: 1, b: 2}`と`%{a: 3, d: 4}`の2つのMapから、`%{a: 4, b: 2, d: 4}`得られました :tada: 
キー`:a`の値は足し算されています。


# ワンポイントレッスン

ワンポイントレッスンです。
裁定をくだす関数はいろんなことができます。

## 先優先にする

```elixir
iex> f = fn _k, v1, _v2 -> v1 end

iex> Map.merge(%{a: 1, b: 2}, %{a: 3, d: 4}, f)
%{a: 1, b: 2, d: 4}
```

## 後優先にする

```elixir
iex> f = fn _k, _v1, v2 -> v2 end

iex> Map.merge(%{a: 1, b: 2}, %{a: 3, d: 4}, f)
%{a: 3, b: 2, d: 4}
```

## キーに応じて処理をわける

```elixir
iex> f = (fn :inoki, _v1, _v2 -> "元氣ですかーーーーッ！！！！"
            _key, v1, v2 -> v1 + v2
     end)

iex> Map.merge(%{a: 1, b: 2, inoki: 123}, %{a: 3, d: 4, inoki: 123}, f)
%{a: 4, b: 2, d: 4, inoki: "元氣ですかーーーーッ！！！！"}
```

キー`:inoki`が重複した場合には、値は`"元氣ですかーーーーッ！！！！"`にしています。その他の場合は足し算です。







# 今日の<font color="#d00080">闘魂</font>

今日は、『孟子』から言葉を引きます。

---
人に<ruby>存<rt>そん</rt></ruby>する者は<ruby>眸子<rt>ぼうし</rt></ruby>より良きはなし
---

解説は、[こちら](https://ats5396.xsrv.jp/4943/)をご参照ください。
猪木さん流に言うと、 **「人間を判断するときには、まず、その人の目を見ろ。夢に溢れた人の目は輝いている。」** ということです。



> 人間の感情は、必ず目に表れる。リング上で対戦相手と向かい合ったときに、相手の目を射貫き、その本性を見抜かなければ勝負にならない。虚勢を張っているのか、それとも心の奥底からの自信があるのか。感情のすべては、必ず目に表れるのだ。（中略）人間を判断するときには、まず、その人の目を見ろ。夢に溢れた人の目はキラキラと輝いている。反対に、腹に一物ある人の目は濁り、嘘をついている人の目はせわしなく泳いでいる。これが闘いを通じて会得した、わたしなりの人間鑑定術だ。

:book:『[アントニオ猪木 最後の闘魂](https://www.amazon.co.jp/dp/4833481057)』:book:から引きました。
みなさまもぜひこの本をお手にとられて、猪木さんが残されたメッセージを通じて、直接猪木さんから「**元氣**」をもらってください。

https://presidentstore.jp/item/008105.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/be8933f5-e3e2-d5f4-1561-f65f75abdf38.png)




# さいごに

[Map.merge/3](https://hexdocs.pm/elixir/Map.html#merge/3)を説明しました。

闘魂の意味は、 **「己に打ち克ち、闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。

<font color="red">$\huge{１、２、３ ぁっダー！}$</font>


<iframe width="910" height="512" src="https://www.youtube.com/embed/AWxwmqzbOaw" title="燃える闘魂 アントニオ猪木  追悼VTR" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

https://www.youtube.com/watch?v=FSz7N5hCltw

---

https://qiita.com/torifukukaiou/items/5e96f4e9f12ec3c4b3f4

---

# Twitter

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Elixir Advent Calendar 3の14日目は、毎度おなじみ <a href="https://twitter.com/torifukukaiou?ref_src=twsrc%5Etfw">@torifukukaiou</a> さんで、Mapモジュールの続き、Map .merge…自分も大好きな関数😌<a href="https://t.co/mg9cJPFJ4g">https://t.co/mg9cJPFJ4g</a><br><br>特に、リスト内にマップがあるケースで、この関数は威力を発揮します😝 <a href="https://t.co/QEEsiQar7D">pic.twitter.com/QEEsiQar7D</a></p>&mdash; piacere (love Elixir, Gravity and VR/AR/Metaverse) (@piacere_ex) <a href="https://twitter.com/piacere_ex/status/1602925229869002752?ref_src=twsrc%5Etfw">December 14, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>