পাইপ অপারেটর

পাইপ অপারেটর (|>) এক এক্সপ্রেশানের রেসাল্টকে আরেক এক্সপ্রেশানের প্রথম প্যারামিটার হিসেবে পাঠিয়ে দেয়। অনেকটা ইউনিক্সের পাইপ অপারেটরের (|) মত।

Introduction

প্রোগ্রামিং করার সময়ে আমরা অনেক সময়ে বেশ অগোছাল কোড লিখে ফেলি। মাঝে মাঝে এক ফাংশনের ভেতর অন্য ফাংশনের নেস্টিং এতটাই গভীরে যায় যে কোডের মূল উদ্দেশ্য বুঝে উঠা মুশকিল হয়ে পরে। নীচের ফাংশনটিকেই দেখুন-

foo(bar(baz(new_function(other_function()))))

এখানে আমরা other_function/0 এর আউটপুটকে new_function/1 এর ভেতর, অতঃপর new_function/1 এর আউটপুটকে baz/1baz/1 থেকে bar/1 এ, এবং অবশেষে bar/1 এর রেসাল্টকে দিয়েছি foo/1 এর প্যারামিটার হিসেবে। ফাংশনাল প্রোগ্রামিং করার সময়ে এরকম পরিস্থিতির শিকার হতেই পারেন। এলিক্সির আপনাকে এই সিনট্যাক্সের বেড়াজাল থেকে খুব সুন্দরভাবে রক্ষা করে পাইপ অপারেটরের মাধ্যমে। পাইপ অপারেটর হল- |> যার কাজ একটি এক্সপ্রেশানের রেসাল্টকে দিয়ে দেয়া পরবর্তী ফাংশনের প্রথমে। উপরের কোডের সমকক্ষ কোড পাইপ অপারেটরে দাঁড়ায়-

other_function() |> new_function() |> baz() |> bar() |> foo()

পাইপ বাম দিকের রেসাল্টকে নিয়ে ডান দিকে দেয়, এবং একই কাজ করতে থাকে সর্বডানে আসার আগ পর্যন্ত।

উদাহরণ

এলিক্সিরের স্ট্রিং মডুলের কিছু উদাহরণ দেখা যাক-

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

বেস্ট প্র্যাকটিস

যদি আপনার ফাংশনের “অ্যারিটি” ১ এর অধিক হয়ে থাকে, তাহলে অবশ্যই প্যারেনথেসিস ব্যবহার করবেন। অন্যথায় “সিনট্যাক্স এরর” হবে না তবে অন্যান্য প্রোগ্রামাররা আপনার কোডকে ভুলভাবে ইন্টারপ্রেট করতে পারে। যদি আমরা উপরের তৃতীয় উদাহরণটিতে String.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

এটি ভুল ধারনা দিতে পারে এবং একে লিখা উচিৎ ব্র্যাকেট দিয়ে যেমন- 

  foo(1) |> bar(2) |> baz(3)

true
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!