Оператор конвейера
Оператор конвейера |> передает результат выполнения выражения первым параметром в другое выражение.
Вступление
Разработка может быть хаотичным процессом. Настолько хаотичным, что вызовы функций становятся очень запутанными, из-за чего их сложно читать. Например, такое выражение:
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"]- Проверка, заканчивается ли строка на “ixir”
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)
trueCaught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!