عم

عملگر لوله در Elixir

10 تمرین

درباره‌ی عملگر لوله

به عملگر |>، «عملگر 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("")
    
ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود

عملگر لوله را یاد بگیرید

تمرین کردن قفل شده است

برای تمرین عملگر لوله قفل 5 تمرین دیگر را باز کنید