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

Оператор конвейера

Оператор конвейера |> передает результат выполнения выражения первым параметром в другое выражение.

Вступление

Разработка может быть хаотичным процессом. Настолько хаотичным, что вызовы функций становятся очень запутанными, из-за чего их сложно читать. Например, такое выражение:

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()

Оператор конвейера получает результат выражения слева и передаёт его в правую часть.

Примеры

Для этих примеров мы будем пользоваться функциями из модуля String.

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

Советы

Если строка получает больше одного параметра, используйте скобки. Это абсолютно не имеет значения для языка, но важно для других разработчиков, которые могут неправильно понять код. Если взять третий пример и убрать оттуда скобки из вызова 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
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!