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!