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 на Elixir.

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

Добри практики

Ако arity на функция е повече от 1, то тогава използвайте скоби. Това не е от особено значение за Elixir, но е важно за други програмисти, които може погрешно да разчетат кода ви. Ако използваме вторият ни пример и премахнем скобите от Enum.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!