El operador |> se llama el operador de tubería. Se puede usar para encadenar llamadas a funciones de manera que el valor devuelto por la llamada anterior se pase como primer argumento a la siguiente llamada a función.
String.replace_suffix(String.upcase(String.duplicate("go ", 3)), " ", "!")
# versus
"go "
|> String.duplicate(3)
|> String.upcase()
|> String.replace_suffix(" ", "!")
También se puede usar en una sola línea:
"go " |> String.duplicate(3) |> String.upcase() |> String.replace_suffix(" ", "!")
Las funciones de Kernel se suelen usar en todas partes sin el nombre del módulo Kernel, pero ese nombre del módulo es necesario cuando se usan esas funciones en una cadena de tuberías. Por ejemplo, 2 * 3 == 6 también se puede escribir así:
2 |> Kernel.*(3) |> Kernel.==(6)
Cuándo usar el operador de tubería y cuándo no es una cuestión de preferencia personal. A algunos desarrolladores de Elixir les gusta seguir estas reglas:
No uses el operador de tubería cuando hagas una sola llamada a función.
# do
String.split("hello", "")
# don't
"hello" |> String.split("")
No crees funciones anónimas directamente en la cadena de tuberías.
# 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).()
Empieza siempre una cadena de tuberías con una variable o un valor literal, no con una llamada a función.
# do
"hello" |> String.upcase() |> String.split("")
# don't
String.upcase("hello") |> String.split("")