$\huge{元氣ですかーーーーッ!!!}$
はじめに
闘魂とElixirが出会いました。
闘魂 meets Elixir.です。
Elixir meets 闘魂.でもよいです。
本日は、Map.merge/3を説明します。
iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}
Map.merge/3
2つのマップをマージします。
マップとはキーと値のアレです。はてな? の方は、「闘魂Elixir ── 11. Mapモジュール」をご覧になってください。
もしも両方のマップに同じキーが含まれている場合は、第3引数に指定した関数で裁定します。レフェリーです。
第3引数の関数は3つの引数をとります。先頭から、キー、先頭Mapの値、後続Mapの値となります。
こちらの図1をみてください。
なかなか複雑ですね。説明します。
%{a: 1, b:2}
と%{a: 3, d: 4}
という2つのMapをマージしています。
キー:a
は両方のマップに含まれています。ですからどうやってマージすればよいか指定してあげる必要があります。
重複するキーがあった場合に値をどのように決めるか、つまりどのように裁定をするのかを関数で第3引数で指定します。ここではこの関数のことを裁定(レフェリー)関数と呼びます。
この裁定(レフェリー)関数は、3つの引数をとります。先頭から、キー、先頭Mapの値、後続Mapの値となります。
ここでの裁定の仕方は足し算(和)としているわけです。
説明はこのくらいにしておきます。
さっそく動かしてみましょう。
IExで確かめてみましょう。
iex
IExが立ち上がったら、以下のプログラムを実行してみてください。
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}
得られました
キー:a
の値は足し算されています。
ワンポイントレッスン
ワンポイントレッスンです。
裁定をくだす関数はいろんなことができます。
先優先にする
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}
後優先にする
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}
キーに応じて処理をわける
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
が重複した場合には、値は"元氣ですかーーーーッ!!!!"
にしています。その他の場合は足し算です。
今日の闘魂
今日は、『孟子』から言葉を引きます。
人に存する者は眸子より良きはなし
解説は、こちらをご参照ください。
猪木さん流に言うと、 「人間を判断するときには、まず、その人の目を見ろ。夢に溢れた人の目は輝いている。」 ということです。
人間の感情は、必ず目に表れる。リング上で対戦相手と向かい合ったときに、相手の目を射貫き、その本性を見抜かなければ勝負にならない。虚勢を張っているのか、それとも心の奥底からの自信があるのか。感情のすべては、必ず目に表れるのだ。(中略)人間を判断するときには、まず、その人の目を見ろ。夢に溢れた人の目はキラキラと輝いている。反対に、腹に一物ある人の目は濁り、嘘をついている人の目はせわしなく泳いでいる。これが闘いを通じて会得した、わたしなりの人間鑑定術だ。
『アントニオ猪木 最後の闘魂』から引きました。
みなさまもぜひこの本をお手にとられて、猪木さんが残されたメッセージを通じて、直接猪木さんから「元氣」をもらってください。
さいごに
Map.merge/3を説明しました。
闘魂の意味は、 「己に打ち克ち、闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
$\huge{1、2、3 ぁっダー!}$
Elixir Advent Calendar 3の14日目は、毎度おなじみ @torifukukaiou さんで、Mapモジュールの続き、Map .merge…自分も大好きな関数😌https://t.co/mg9cJPFJ4g
— piacere (love Elixir, Gravity and VR/AR/Metaverse) (@piacere_ex) December 14, 2022
特に、リスト内にマップがあるケースで、この関数は威力を発揮します😝 pic.twitter.com/QEEsiQar7D
$\huge{元氣があればなんでもできる!}$
-
図は、https://excalidraw.com/ を使って作成しています。スゴ腕ハッカーが書いたかのような手書き風の絵が書けるので最近の私のお気に入りツールです。 ↩