Der |>-Operator heißt Pipe-Operator. Mit ihm lassen sich Funktionsaufrufe so verketten, dass der Rückgabewert des vorherigen Funktionsaufrufs als erstes Argument an den nächsten Funktionsaufruf übergeben wird.
String.replace_suffix(String.upcase(String.duplicate("go ", 3)), " ", "!")
# versus
"go "
|> String.duplicate(3)
|> String.upcase()
|> String.replace_suffix(" ", "!")
Er lässt sich auch in einer einzigen Zeile verwenden:
"go " |> String.duplicate(3) |> String.upcase() |> String.replace_suffix(" ", "!")
Kernel-Funktionen werden normalerweise überall ohne den Modulnamen Kernel verwendet, aber der Modulname ist nötig, wenn du diese Funktionen in einer Pipe-Kette verwendest. Zum Beispiel lässt sich 2 * 3 == 6 auch so schreiben:
2 |> Kernel.*(3) |> Kernel.==(6)
Ob man den Pipe-Operator verwendet oder nicht, ist Geschmackssache. Manche Elixir-Entwickler folgen gern diesen Regeln:
Verwende den Pipe-Operator nicht für einen einzelnen Funktionsaufruf.
# do
String.split("hello", "")
# don't
"hello" |> String.split("")
Erstelle keine anonymen Funktionen direkt in der Pipe-Kette.
# do
take_n_letters = fn n -> Enum.take(?a..?z, n) end
2 |> Kernel.*(3) |> take_n_letters.()
# don't
2 |> Kernel.*(3) |> (fn n -> Enum.take(?a..?z, n) end).()
Beginne eine Pipe-Kette immer mit einer Variable oder einem Literalwert, nicht mit einem Funktionsaufruf.
# do
"hello" |> String.upcase() |> String.split("")
# don't
String.upcase("hello") |> String.split("")