はじめに
- 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?/2が
true
になるものはシングルクォーテーションで文字のリストが表示されます - ちなみにElixirの使い手のことをアルケミストと呼ばれます
-
Charlistsのことは一旦おいておきまして、各要素に3を加えて、200未満の整数のみをリストに残す プログラムをみてみましょう
- 気になる方はCharlistsや以下の記事をご確認ください
- Elixirで整数リストが「謎の文字」として返ってくる現象と、文字列・文字リストについて
-
Enum.filter(Enum.map(list, & &1 + 3), & &1 < 200)
は、たしかに動いてはいますがパッと見なにをしているのかわかりにくいですよね - そんなときに使うのが|>です
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の魅力に取り憑かれたものだけが感じる美意識のようなものなのかもしれません
- EnumはElixirを使う上でよく使うモジュールですので、一通りどんな関数があるのか眺めていただけるとよいとおもいます
- 時間のないあなたのために、独断と偏見で特によく使うとおもわれるものをピックアップしておきます
Wrapping Up
- 今日のポイントは、|>、Enumモジュールです
- 次回は、ちらっと例をみせたHTTP GET!を詳しくみていきたいとおもいます
- 来週を待ちきれない方は、リソースやコミュニティの情報を Where to go next にまとめていますのでダイブしてください!
- Enjoy!!!