14
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

fukuoka.ex Elixir/PhoenixAdvent Calendar 2021

Day 3

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

Last updated at Posted at 2021-12-02

2021/12/03の回です。

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

はじめに

  • Elixirを楽しんでいますか:bangbang::bangbang::bangbang:
  • |>の話をします
  • よく使いますよね
  • たとえばこんな風に、$\huge{Awesome}$ なプログラムを書けます
    • QiitaのAPIエンドポイントがありまして
    • |> GETするでしょ、いつやるの? 今でしょ!
    • |> bodyを取り出します、いつやるの? 今でしょ!
    • |> JSONデーコードするでしょ、いつやるの? 今でしょ!
    • |> そうすると各要素がマップのリストが得られるので、情報量が多いからとりあえずタイトルとURLだけにするでしょ、いつやるの? 今でしょ!
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のプログラミングではよく使います
  • |>を使わずに書いた場合、こんな感じになります
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引数なんだよなあ〜

  • ただ、|>を使う上で、前の値を次の関数の第2引数以降にセットしたいときに困ります
    • タイトルは「第2引数」とだけ書きましたが、第3引数でも第4引数でも事情は同じです
  • 代表例はFile.write/3です
    • 第一引数がファイルのパス
    • 第二引数がcontent
    • 第三引数は、リンク先をみてください(私、modesなんて指定したことないです)
  • たとえばAzureのText to Speech APIを使って、文字列 -> 音声データへと変換して、音声データをファイルに書き込むときに困るわけです

|>を使わない

  • 困るとか言うのなら、|>で無理につなげなくてもいいんじゃないの
  • アリだとおもいます
content = "awesome"

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

File.write("output", content)

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

content |> (fn content -> File.write("output", content) end).()
  • 『仁義なき戦い』では、「格好つけんにゃならん」とか何とかという言葉が飛び交います

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

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

then/2を使う

content |> then(fn content -> File.write("output", content) end)
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 :bangbang::bangbang:
  • Elixirのプログラムには、|>がよくでてきます
  • |>を使ってスイスイ、プログラミングしていくことができます
  • 次の関数の第2引数なんだよな〜 というときは、無理につなげないか、Elixirの1.12以上を使ってthen/2を使うとよいでしょう

コミュニティ

FCOvBkAUYAE6mL8.jpeg

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

もっとElixirのことを知りたい方へオススメの書籍 :books:


明日は、@t-yamanashiの「LiveViewで匿名SNSを作ろう piyopiyo.ex#2」です。
お楽しみに〜:tada::tada::tada:

14
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?