Do you want to pick up from where you left of?
Take me there

パイプ演算子

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

導入

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

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

ここでは、 other_function/0 の値を 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
間違いを報告したい、あるいはこのレッスンに貢献したい? このレッスンをGitHubで編集しよう!