به عملگر |>، «عملگر pipe» میگویند. میتوان از آن برای زنجیرهکردن فراخوانیهای تابع استفاده کرد، به این شکل که مقداری که فراخوانی تابع پیشین برمیگرداند، بهعنوان آرگومان اول به فراخوانی تابع بعدی داده میشود.
String.replace_suffix(String.upcase(String.duplicate("go ", 3)), " ", "!")
# versus
"go "
|> String.duplicate(3)
|> String.upcase()
|> String.replace_suffix(" ", "!")
همچنین میتوان آن را در یک خط هم به کار برد:
"go " |> String.duplicate(3) |> String.upcase() |> String.replace_suffix(" ", "!")
توابع Kernel را معمولاً همهجا بدون نام ماژول Kernel به کار میبرند، اما برای بهکارگیری آن توابع در یک زنجیرهی pipe، نام ماژول لازم است. برای نمونه، 2 * 3 == 6 را میتوان به این شکل هم نوشت:
2 |> Kernel.*(3) |> Kernel.==(6)
اینکه کجا از عملگر pipe استفاده کنیم و کجا نه، به سلیقهی شخصی بستگی دارد. برخی از توسعهدهندگان Elixir دوست دارند این قواعد را رعایت کنند:
وقتی فقط یک فراخوانی تابع انجام میدهید، از عملگر pipe استفاده نکنید.
# do
String.split("hello", "")
# don't
"hello" |> String.split("")
تابع بینام را مستقیم درون زنجیرهی 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).()
زنجیرهی pipe را همیشه با یک متغیر یا مقدار ثابت شروع کنید، نه با یک فراخوانی تابع.
# do
"hello" |> String.upcase() |> String.split("")
# don't
String.upcase("hello") |> String.split("")