ようへいの日々精進XP

よかろうもん

Elixir School に入学した(1)〜 パイプライン演算子 〜

Elixir School という学校に入学した

入試は無いけど、卒業は何時になるかわからない。

elixirschool.com

上記のサイトの各レッスンを適当に掻い摘んで勉強してみようと思う。

尚、手元の環境については Docker イメージで提供されている Elixir 環境又は MacOS X に導入した Elixir を利用する。

#
# Docker の場合
#
$ docker run -t -i --rm elixir
Erlang/OTP 19 [erts-8.3.5] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

Interactive Elixir (1.4.4) - press Ctrl+C to exit (type h() ENTER for help)

#
# MacOS X の場合
#
$ iex
Erlang/OTP 19 [erts-8.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.4.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>

今日は

パイプライン演算子

Elixir の特徴の一つであるパイプライン演算子から学んでいきたい。

elixirschool.com

パイプライン演算子とは

  • ある式の結果の別の式の第一引数として渡す処理
  • シェル操作の |(パイプ)に似た処理を行える
  • 複数の引数がある場合にも利用可能

例えば

文字列を分割して list オブジェクトを生成したい場合。

iex(1)> String.split("hoge fuga")
["hoge", "fuga"]

こんな風に書きたくなる衝動。

パイプライン演算子を使えば以下のように書くことができる。

iex(3)> "hoge, fuga" |> String.split
["hoge", "fuga"]
iex(4)>

これは便利だし、個人的には後者(パイプライン演算子)を使った方が直感的な気がする。

更に

文字列を大文字に変更してから list 化する場合。

iex(9)> String.split(String.upcase("hoge fuga"))
["HOGE", "FUGA"]

一応、こんな風に書いても動くけど、パイプライン演算子を使えば…

iex(13)> "hoge fuga" |> String.upcase |> String.split
["HOGE", "FUGA"]

コード量的にはそんなに変わらないような気がするけど、パイプライン演算子を使った方が何をしているのか一目で分かるような気がするし、シェルのパイプっぽい。

も少し

以下のようなテキストファイルがあったとする。

$ cat test.txt
aaaaaaaaaaaaaaaaa
bbbbb
ccccccccccccc
dddddddd
eeeeeeeeeee

そのテキストファイルを読み込んでリスト化する例。

#
# パイプライン演算子を利用
#
$ iex
...
iex(1)> File.read!("test.txt") |> String.replace("\n", " ") |> String.split
["aaaaaaaaaaaaaaaaa", "bbbbb", "ccccccccccccc", "dddddddd", "eeeeeeeeeee"]

パイプライン演算子を使わない場合には以下のように書く。

#
# パイプライン演算子未使用
#
$ iex
...
iex(1)> String.split(String.replace(File.read!("test.txt"), "\n", " "))
["aaaaaaaaaaaaaaaaa", "bbbbb", "ccccccccccccc", "dddddddd", "eeeeeeeeeee"]

なんだかパイプライン演算子を使った方が見た目が良い。

データ変換の流れが読める

Elixir のパイプライン演算子ってどんなことが出来ると?というレベルだったけど、プログラミング Elixirの冒頭に「プラグラミングはデータの変換をするものだ」という文言があったけど、まさにパイプライン演算子はデータ変換の過程を読む出来ると思う。(プログラミング Elixir の 55 ページより引用)