LoginSignup
5
2

More than 3 years have passed since last update.

Enjoy Elixir #005 Pipe operator and Enum module

Last updated at Posted at 2020-06-29
1 / 13

はじめに

  • KFIEという近畿大学産業理工学部の情報系コミュニティがあります
  • 最近は、毎週火曜日にLT会をやっているそうです
  • 私が学生だったのはもうずいぶん昔のことなのですが、参加させてもらっています
  • 毎週、5分間時間をもらって、Elixirいいよ! を伝えていきたいとおもいます
  • 今日は以下を学びます
    • Pipe operator and Enum module
  • A journey of a thousand miles begins with a single step.
  • この記事はElixirを触るのがはじめてという方に向けて書いています

もくじ

001 mix new, iex -S mix, mix format
|> 002 型
|> 003 Pattern matching
|> 004 Modules and functions
|> 005 Pipe operator and Enum module
|> 006 HTTP GET!
|> 007 Flow
|> 008 AtCoderを解いてみる
|> 999 Where to go next


準備

$ mix new hello
$ cd hello

Pipe operator

  • Pipe operatorは|>のことです
  • たとえば以下のリストの各要素に3を加えて、200未満の整数のみをリストに残すことを考えてみましょう
[84, 197, 98, 197, 29, 197, 94, 197, 111, 197, 98, 197, 29, 197, 113, 197, 101,
 197, 98, 197, 29, 197, 62, 197, 105, 197, 96, 197, 101, 197, 98, 197, 106, 197,
 102, 197, 112, 197, 113, 197, 112, 197, 41, 197, 29, 197, 106, 197, 118, 197,
 29, 197, 99, 197, 111, 197, 102, 197, 98, 197, 107, 197, 97, 197, 112, 30]

  • 各要素に3を加えるEnum.map/2を使うとよいです
  • たとえばこんな感じです
iex> Enum.map([1, 2, 3], & &1 + 3)
[4, 5, 6]

  • 200未満の整数のみをリストに残すEnum.filter/2を使うとよいでしょう
  • たとえばこんな感じです
iex> Enum.filter([10, 200, 199, 100, 300], & &1 < 200)
[10, 199, 100]

  • それでは最初の問題を解いてみましょう
iex> list = [84, 197, 98, 197, 29, 197, 94, 197, 111, 197, 98, 197, 29, 197, 113, 197, 101,
 197, 98, 197, 29, 197, 62, 197, 105, 197, 96, 197, 101, 197, 98, 197, 106, 197,
 102, 197, 112, 197, 113, 197, 112, 197, 41, 197, 29, 197, 106, 197, 118, 197,
 29, 197, 99, 197, 111, 197, 102, 197, 98, 197, 107, 197, 97, 197, 112, 30]

iex> Enum.filter(Enum.map(list, & &1 + 3), & &1 < 200)
'We are the Alchemists, my friends!'
  • ElixirにはCharlistsと呼ばれるものがありまして、List.scii_printable?/2trueになるものはシングルクォーテーションで文字のリストが表示されます
  • ちなみにElixirの使い手のことをアルケミストと呼ばれます


iex> Enum.map(list, & &1 + 3) |> Enum.filter(& &1 < 200)
'We are the Alchemists, my friends!'

iex> list |> Enum.map(& &1 + 3) |> Enum.filter(& &1 < 200)
'We are the Alchemists, my friends!'
  • いかがでしょうか、だいぶ読みやすくなりましたよね!
  • リストがある |> 各要素に3を加える |> 200未満の整数のみをリストに残す
  • |>を使うことで、やりたいこととソースコードの順序がぴったり一致します
    • 前の計算結果が次の関数の第一引数に入って関数が実行されます

  • たとえば以下はJSONが返ってくるAPIをコールして、bodyを取り出して、JSONデコードして、"items_count"キーの値を取り出すプログラム例です
    • どうでしょうか!
    • 言葉での説明とプログラムの順序がぴったり一致します!
    • 美しい!(※)
HTTPoison.get!("https://qiita.com/api/v2/users/torifukukaiou")
|> Map.get(:body)
|> Jason.decode!()
|> Map.get("items_count")
  • (※)たいていのプログラミング言語は上から下に処理が流れると言われればその通りですし、これはElixirの魅力に取り憑かれたものだけが感じる美意識のようなものなのかもしれません

  • EnumElixirを使う上でよく使うモジュールですので、一通りどんな関数があるのか眺めていただけるとよいとおもいます
  • 時間のないあなたのために、独断と偏見で特によく使うとおもわれるものをピックアップしておきます

Wrapping Up

  • 今日のポイントは、|>Enumモジュールです
  • 次回は、ちらっと例をみせたHTTP GET!を詳しくみていきたいとおもいます
    • 来週を待ちきれない方は、リソースやコミュニティの情報を Where to go next にまとめていますのでダイブしてください!
  • Enjoy!!!
5
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
5
2