【Elixir】次の関数の第2引数なんだよな〜 2021年12月 (2021/12/03)

https://qiita.com/advent-calendar/2021/fukuokaex

2021/12/03の回です。

前日は、@hisawayの「[[Elixir] ラベル付きinspectのラベルを端折る](https://qiita.com/hisaway/items/81208dbaa39af352866d)」でした。
@hisawayさんは、**自称メタプロ芸人**:tada::tada::tada:
**自称**って、謙遜されていますけど、正真正銘、免許皆伝の**メタプロ芸人**だとおもいます:rocket::rocket::rocket:


# はじめに
- [Elixir](https://elixir-lang.org/)を楽しんでいますか:bangbang::bangbang::bangbang:
- [|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)の話をします
- よく使いますよね
- たとえばこんな風に、<font color="purple">$\huge{Awesome}$</font> なプログラムを書けます
    - QiitaのAPIエンドポイントがありまして
    - |> GETするでしょ、**いつやるの？　今でしょ！**
    - |> bodyを取り出します、**いつやるの？　今でしょ！**
    - |> JSONデーコードするでしょ、**いつやるの？　今でしょ！**
    - |> そうすると各要素がマップのリストが得られるので、情報量が多いからとりあえずタイトルとURLだけにするでしょ、**いつやるの? 今でしょ！**

```elixir
Mix.install([{:jason, "~> 1.2"}, {:httpoison, "~> 1.8"}])

"https://qiita.com/api/v2/items?query=tag:elixir"
|> URI.encode()
|> HTTPoison.get!()
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.take(&1, ["title", "url"]))
```

- [Elixir](https://elixir-lang.org/)のプログラミングではよく使います
- `|>`を使わずに書いた場合、こんな感じになります

```elixir
Enum.map(
  Jason.decode!(Map.get(
    HTTPoison.get!(
      URI.encode("https://qiita.com/api/v2/items?query=tag:elixir")),
    :body)),
  & Map.take(&1, ["title", "url"]))
```


# 次の関数の第2引数なんだよなあ〜
- ただ、[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)を使う上で、前の値を次の関数の第2引数以降にセットしたいときに困ります
    - タイトルは「第2引数」とだけ書きましたが、第3引数でも第4引数でも事情は同じです
- 代表例は[File.write/3](https://hexdocs.pm/elixir/File.html#write/3)です
    - 第一引数がファイルのパス
    - 第二引数がcontent
    - 第三引数は、リンク先をみてください(私、`modes`なんて指定したことないです)
- たとえばAzureの[Text to Speech](https://azure.microsoft.com/ja-jp/services/cognitive-services/text-to-speech/) APIを使って、文字列 -> 音声データへと変換して、音声データをファイルに書き込むときに困るわけです

## [|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)を使わない

- 困るとか言うのなら、[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)で無理につなげなくてもいいんじゃないの
- アリだとおもいます

```elixir
content = "awesome"
```

↑以降のプログラムで使う`content`変数には、共通して<font color="purple">$\huge{Awesome}$</font>が束縛されているものとします。

```elixir
File.write("output", content)
```

## 無名関数でカッコ(格好)つける

```elixir
content |> (fn content -> File.write("output", content) end).()
```

- 『仁義なき戦い』では、「格好つけんにゃならん」とか何とかという言葉が飛び交います


## 無名関数でカッコ(格好つける) -- その2(&表記でキメる)

```elixir
content |> (&File.write("output", &1)).()
```

## [then/2](https://hexdocs.pm/elixir/Kernel.html#then/2)を使う
- [Elixir](https://elixir-lang.org/) 1.12で追加されています :rocket::rocket::rocket:
- @koga1020 さんの「[【Elixir v1.12】tap/2, then/2が便利](https://zenn.dev/koga1020/articles/aafcc804b65c5a28caa7)」で知りました
    - ありがとうございます！ :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5: 

```elixir
content |> then(fn content -> File.write("output", content) end)
```

```elixir
content |> then(&File.write("output", &1))
```



# Wrapping up :qiitan::lgtm::xmas-tree::santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5::lgtm::xmas-tree::qiitan:
- Enjoy [Elixir](https://elixir-lang.org/) :bangbang::bangbang:
- [Elixir](https://elixir-lang.org/)のプログラムには、[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)がよくでてきます
- [|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)を使ってスイスイ、プログラミングしていくことができます
- **次の関数の第2引数なんだよな〜** というときは、無理につなげないか、[Elixir](https://elixir-lang.org/)の1.12以上を使って[then/2](https://hexdocs.pm/elixir/Kernel.html#then/2)を使うとよいでしょう



## コミュニティ
- [elixir.jp](https://join.slack.com/t/elixirjp/shared_invite/zt-ae8m5bad-WW69GH1w4iuafm1tKNgd~w) Slack workspaceに参加してみてください
    - マヂ、やさしい人ばっかりのコミュニティ
    - あなたの**困った**をきっと解決してくれるでしょう
- たくさんのコミュニティがあります
    - @kn339264 さん作の素敵な資料をご紹介します
    - [Elixirコミュニティ の歩き方〜国内オンライン編〜](https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian) :clap::clap_tone1::clap_tone2::clap_tone3::clap_tone4::clap_tone5:

![FCOvBkAUYAE6mL8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/a277d0ea-2780-d9a3-4062-66d38b175125.jpeg)

(@piacerex さん作 :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:)

## もっと[Elixir](https://elixir-lang.org/)のことを知りたい方へオススメの書籍 :books: 
- [プログラミングElixir（第2版）](https://www.ohmsha.co.jp/book/9784274226373/) -- オーム社
- [Elixir実践ガイド](https://book.impress.co.jp/books/1120101021) -- インプレス
- [アルケミスト − 夢を旅した少年](https://www.kadokawa.co.jp/product/199999275001/) -- KADOKAWA

---

明日は、@t-yamanashiの「[LiveViewで匿名SNSを作ろう　piyopiyo.ex#2](https://qiita.com/t-yamanashi/items/89b63335d5a3d87efea6)」です。
お楽しみに〜:tada::tada::tada: