闘魂Elixir ── 08. Enum.filter

<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 闘魂.でもよいです。

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

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

# [Enum.filter/2](https://hexdocs.pm/elixir/Enum.html#filter/2)

Enumerableなものの要素ひとつひとつに関数を適用して、得られた結果がtruthyとなる要素のみを残します。

「Enumerableなもの」がはてな？　の方は、「[闘魂Elixir ── 06. Enumモジュール](https://qiita.com/torifukukaiou/items/bb9d43cde4d667cddb30)」を振り返ってくださいませ。

Input(元)のEnumerableなものの長さと、[Enum.filter/2](https://hexdocs.pm/elixir/Enum.html#filter/2)を通して変換されたOutputのリストの長さは同じになるか、少なくなるか、空になるかのいずれかです。
Input(元)のEnumerableなものの長さより長くなることはありません。

言葉にするとなんだか難しいかもしれませんが、こちらの図をみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/d0d671d1-253d-8823-aa7b-24835c2483ec.png)


上図の説明をします。[^1]
整数1〜5の5個の要素からなる、`[1,2,3,4,5]`をInputにしています。
各要素に適用する関数は、`f = fn x -> rem(x, 2) == 0 end`です。この関数はinputの値を2で割った余りが0かどうかを比較しています。つまり偶数であれば`true`で、奇数の場合には`false`となります。
`Enum.filter([1,2,3,4,5], f)`の実行結果は、`[2, 4]`が得られます。

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

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

```:CMD
iex
```

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

```elixir
iex> f = fn x -> rem(x, 2) == 0 end

iex> Enum.filter([1,2,3,4,5], f)   
[2, 4]
```

`[1,2,3,4,5]` => `[2, 4]`の変換ができました:tada::tada::tada::tada::tada:


# ワンポイントレッスン

ここでは、絵がごちゃごちゃするので、各要素に適用する関数を`f`という変数に束縛しました。
これは以下のように書いても動きます。

```elixir
iex> Enum.filter([1,2,3,4,5], fn x -> rem(x, 2) == 0 end)
[2, 4]
``` 

そしてこちらの書き方のほうが圧倒的に多く使われるので、この書き方に慣れてください。
また、[&](https://hexdocs.pm/elixir/Kernel.SpecialForms.html#&/1)を使って書くこともできます。

```elixir
iex> Enum.filter([1,2,3,4,5], & rem(&1, 2) == 0)
[2, 4]
``` 

こちらもよく見かけるので慣れておくと吉です。
[&](https://hexdocs.pm/elixir/Kernel.SpecialForms.html#&/1)の説明は以下をご参照ください。

https://hexdocs.pm/elixir/Kernel.SpecialForms.html#&/1-anonymous-functions



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

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

---
志は氣の<ruby>帥<rt>すい</rt></ruby>なり（孟子）
---

解説は、[こちら](http://mpworks.jp/meigen/185/)をご参照ください。
猪木さん流に言うと、「もし、そこに夢がなければ、そこに夢をつくって生きてきた」ということです。
:book:『[アントニオ猪木　最後の闘魂](https://presidentstore.jp/item/008105.html)』: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)


# さいごに

[Enum.filter/2](https://hexdocs.pm/elixir/Enum.html#filter/2)を説明しました。

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

<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の8日目は、自身が25日分のコラムを綴り、他者にもソレをオススメしている <a href="https://twitter.com/torifukukaiou?ref_src=twsrc%5Etfw">@torifukukaiou</a> さんが、毎度「元氣ですかーーーーッ！！！」から始まるElixirワンポイントレッスン💁‍♂️<a href="https://t.co/IgYnKhEhtN">https://t.co/IgYnKhEhtN</a><br><br>今回は、Enum .filterという、Enumシリーズではmapの次に重要な関数😌 <a href="https://t.co/zdewBYoSYq">pic.twitter.com/zdewBYoSYq</a></p>&mdash; piacere (love Elixir, Gravity and VR/AR/Metaverse) (@piacere_ex) <a href="https://twitter.com/piacere_ex/status/1600717078402854913?ref_src=twsrc%5Etfw">December 8, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

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