Fork me on GitHub

パイプライン演算子

パイプライン演算子(|>)はある式の結果を別の式に1つ目の引数として渡します。

目次

導入

プログラミングは厄介になりえます。実際とても厄介なことに、関数呼び出しを深くしすぎると把握するのがとても難しくなります。以下のネストされた関数を考えてみてください:

foo(bar(baz(new_function(other_function()))))

ここでは、other_function/1の値をnew_function/1に、new_function/1の値をbaz/1に、baz/1の値をbar/1に、そして最後にbar/1の結果をfoo/1に渡しています。
Elixirではパイプライン演算子を使うことによって構文的な混沌に対し現実的にアプローチします。
パイプライン演算子(|>)は 一つの式の結果を取り、それを渡します。先ほどのコードスニペットをパイプライン演算子で書き直すとどうなるか、見てみましょう。

other_function() |> new_function() |> baz() |> bar() |> foo()

パイプライン演算子は結果を左に取りそれを右側に渡します。

この例のセットのためにElixirのStringモジュールを使います。

iex> "Elixir rocks" |> String.split
["Elixir", "rocks"]
iex> "Elixir rocks" |> String.upcase |> String.split
["ELIXIR", "ROCKS"]
iex> "elixir" |> String.ends_with?("ixir")
true

ベストプラクティス

関数のアリティが1より多いなら括弧を使うようにしてください。括弧の有無はElixirにおいてはたいした問題ではありませんが、あなたのコードを誤解するかもしれない他のプログラマにとっては問題です。もし3つ目の例でString.ends_with?/2から括弧を削除すると, 以下のように警告されます。

iex> "elixir" |> String.ends_with? "ixir"
warning: parentheses are required when piping into a function call. For example:

  foo 1 |> bar 2 |> baz 3

is ambiguous and should be written as

  foo(1) |> bar(2) |> baz(3)

true

このページをシェアする