1. OverView
こいつも何度も使ってしまっている、パイプ演算子であります。
実際、()でネストしまくりよりもわかりやすく、特にサンプルなんかだと重宝します。
奥が深い物なのですが、とりあえず現時点での考え方を書いていきましょう。
2. とりあえず解説
Elixirのパイプ演算子(|>)は、関数の出力を次の関数の入力として渡すために使用されます。
function_1() |> function_2()
function_1の結果を、function_2の第一引数として渡します。
Elixir Schoolでは、以下のサンプルがありますね。
foo(bar(baz(new_function(other_function()))))
さぁ、正解を見ずに、ちょっとやってみますか…
ネストの深い順番、一番下から、書いていきます。
other_function/0の結果を、new_function/1に、new_function/1の結果をbaz/1に、
baz/1の結果をbar/1に、bar/1bの結果を、foo/1に…うん、あってるな。
まー、この手の書き方を簡略化するのが、パイプです。
上の例を書くと、
other_function() |> new_function() |> baz() |> bar() |> foo()
処理の流れが、つかみやすくなったのではないでしょうか?
さて、Elixir Schoolの例をやってみましょう。
' 'で区切られた文字列を分割する。
"Elixir rocks" |> String.split()
["Elixir", "rocks"]
1)で区切った文字を、大文字に変換する
"Elixir rocks" |> String.upcase() |> String.split()
["ELIXIR", "ROCKS"]
さて、ここでおまけ
dbg()と言う関数がありまして、これが、Elixrのパイプ処理の流れを表示してくれます。
iex(94)> "Elixir rocks" |> String.upcase() |> String.split() |> dbg()
[iex:94: (file)]
"Elixir rocks" #=> "Elixir rocks"
|> String.upcase() #=> "ELIXIR ROCKS"
|> String.split() #=> ["ELIXIR", "ROCKS"]
["ELIXIR", "ROCKS"]
処理の流れがよくわかるので、動きがよくわかるんじゃないでしょうか。
3. 本日のチートシート!
制御構造の名 | 説明 | 例 |
---|---|---|
パイプ演算子 | 関数の出力を次の関数の入力として渡すために使用されます。 | "Elixir rocks" |
4. 本日の課題
Elixir Schoolでは、ベストプラクティスとして「関数のアリティが1より多いなら括弧を使うようにしてください」
と書いてますが、うーん、これはケースバイケースかなぁ、と思います。
もう少し、書いてから戻ってきて、解説してみますわ。