O operador |> é chamado de operador pipe. Ele pode ser usado para encadear chamadas de função de modo que o valor retornado pela chamada de função anterior seja passado como primeiro argumento para a próxima chamada de função.
String.replace_suffix(String.upcase(String.duplicate("go ", 3)), " ", "!")
# versus
"go "
|> String.duplicate(3)
|> String.upcase()
|> String.replace_suffix(" ", "!")
Ele também pode ser usado em uma única linha:
"go " |> String.duplicate(3) |> String.upcase() |> String.replace_suffix(" ", "!")
As funções de Kernel geralmente são usadas em qualquer lugar sem o nome do módulo Kernel, mas o nome do módulo é necessário ao usar essas funções em uma cadeia de pipe. Por exemplo, 2 * 3 == 6 também pode ser escrito como:
2 |> Kernel.*(3) |> Kernel.==(6)
Usar ou não o operador pipe é uma questão de preferência pessoal. Alguns desenvolvedores de Elixir gostam de seguir estas regras:
Não use o operador pipe quando fizer uma única chamada de função.
# do
String.split("hello", "")
# don't
"hello" |> String.split("")
Não crie funções anônimas diretamente na cadeia de pipe.
# do
take_n_letters = fn n -> Enum.take(?a..?z, n) end
2 |> Kernel.*(3) |> take_n_letters.()
# don't
2 |> Kernel.*(3) |> (fn n -> Enum.take(?a..?z, n) end).()
Sempre comece uma cadeia de pipe com uma variável ou um valor literal, e não com uma chamada de função.
# do
"hello" |> String.upcase() |> String.split("")
# don't
String.upcase("hello") |> String.split("")