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