Fork me on GitHub

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

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

Содержание

Вступление

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

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

Тут передан результат вызова other_function/1 в 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

Поделиться