রুবিতে টার্নারি অপারেটর কী?
একটি টার্নারি অপারেটর তিনটি অংশে গঠিত, এখান থেকে "টার্নারি" শব্দটি এসেছে। এই অংশগুলোর মধ্যে আছে একটি কন্ডিশনাল স্টেটমেন্ট এবং দুটি সম্ভাব্য ফলাফল।
অন্য কথায়, একটি টার্নারি আপনাকে একটি কম্প্যাক্ট if/else এক্সপ্রেশন শুধু এক লাইন কোডে লিখতে দেয়।
উদাহরণস্বরূপ:
if apple_stock > 1 :eat_apple else :buy_apple end
এটি পরিবর্তন হতে পারে:
apple_stock > 1 ? :eat_apple : :buy_apple
টার্নারি অপারেটরের জন্য ধন্যবাদ!
প্রশ্ন…
এটি সঠিকভাবে কীভাবে কাজ করে এবং সঠিক সিনট্যাক্স কী?
আসুন জানি।
আপনার নিজের টার্নারি লিখার জন্য একটি টেমপ্লেট
আমরা যদি টার্নারি অপারেটরের সিনট্যাক্সকে জেনারেলাইজ করি, তবে একটি "ফিল ইন দ্য ব্ল্যাংক" টাইপের টেমপ্লেট পাব।
এটি এইরকম দেখে:
condition ? true : false
একটি টার্নারি অপারেটরের প্রথম অংশ হলো কন্ডিশন, অর্থাৎ আপনি যে কন্ডিশনটি চেক করতে চান সেটি সত্য কিনা।
তারপর একটি প্রশ্নচিহ্ন (?) থাকে।
এটি সিনট্যাক্সের অংশ!
এইভাবে রুবি বুঝতে পারে যে আপনি একটি টার্নারি অপারেটর লিখছেন।
এরপর:
আমাদের থাকে যে কোডটি আপনি রান করতে চান যদি কন্ডিশনটি true হয়, প্রথম সম্ভাব্য ফলাফল।
তারপর একটি কোলন (:), আরেকটি সিনট্যাক্স এলিমেন্ট।
শেষে, যে কোডটি আপনি রান করতে চান যদি কন্ডিশনটি false হয়, দ্বিতীয় সম্ভাব্য ফলাফল।
উদাহরণ:
"chocolate".size > 4 ? "More than four characters" : "Less than four characters"
- কন্ডিশন =>
"chocolate".size > 4 - যদি True =>
"More than four characters" - অন্যথায় =>
"Less than four characters"
এই তিনটি অংশ প্রতিটি টার্নারি এক্সপ্রেশনের কম্পোনেন্ট।
আপনার ? কন্ডিশন এবং সম্ভাব্য ফলাফলের মাঝপথে রাখা ভুলবেন না, এমনকি যদি মেথডের নাম প্রশ্নচিহ্ন দিয়ে শেষ হয়।
উদাহরণ:
"".empty? ? "Yes" : "No"
এটি সহজে উপেক্ষা করা যায়, তাই এই ধরনের কোড লিখার সময় সতর্ক থাকুন।
জটিল টার্নারি অপারেটর (Complex Ternary Operators)
টার্নারি অপারেটর ভুলভাবে ব্যবহার করা যেতে পারে।
যখন আপনি এর সাথে কিছু জটিল কাজ করতে চান, তখন এটি একটি বুরা আইডিয়া হতে শুরু করে।
উদাহরণ:
আপনি একটি টার্নারি এক্সপ্রেশনের ফলাফল একটি ভেরিয়েবলে অ্যাসাইন করতে পারেন।
a = 10 > 5 ? "yes" : "no"
এটি ঠিক আছে।
কিন্তু যখন আপনার সম্ভাব্য ফলাফলগুলোর মধ্যে স্পেস থাকে, তখন এটি আরও জটিল হয়ে ওঠে।
এখানে একটি উদাহরণ:
10 > 5 ? (puts "yes") : (puts "no")
এখানে আমাদের প্যারেন্থেসিস ব্যবহার করতে হয়।
কেন?
কারণ যদি আপনি না করেন, তবে আপনি একটি SyntaxError পাবেন।
এই প্যারেন্থেসিসগুলো এই কোডটিকে কিছুটা বুঝতে কঠিন করে তোলে, যা রিডেবিলিটি এবং স্টাইল সুবিধাগুলো হড়াপ করিয়ে যায় যা টার্নারি ব্যবহার করার সময় পাওয়া যায়।
টার্নারি ব্যবহার করবেন কিনা সেটি বেছে নেওয়ার সময় এটিকে মনে রাখুন।
টার্নারি অপারেটর ও অপারেটর প্রেসিডেন্স (Ternary Operators & Operator Precedence)
টার্নারি এক্সপ্রেশন নিয়ে আসা আরেকটি সমস্যা হলো অপারেটর প্রেসিডেন্স।
এখানে একটি উদাহরণ:
[].tap { |a| a << "ccccc".size == 0 ? "empty" : "not empty" } # [5]
আমি "empty" বা "not empty" এক্সপেক্ট করতাম, আমাদের টার্নারির দুটি সম্ভাব্য ফলাফল, কিন্তু আমরা পেলাম 5।
কী হচ্ছে?
হোসোছে যে রুবি এবং অধিকাংশ প্রোগ্রামিং ল্যাঙ্গুয়েজ এক্সপ্রেশনগুলো ভিন্ন ভিন্ন প্রায়োরিটির স্তরে প্রসেস করে।
এটি সিম্পল অর্থমিতিকেও ঘটে!
আপনি জানেন, গুণ ভাগ যোগ ও বিয়োগের আগে ইভ্যালুয়েট হয়।
সদৃশভাবে, রুবিতে, একটি মেথড কল (<< এবং size) টার্নারি অপারেটরের চেয়ে প্রেসিডেন্স পায়, যা গত উদাহরণের আচরণ ব্যাখ্যা করে।
আপনি প্যারেন্থেসিস দিয়ে এটি সমাধান করতে পারেন:
[].tap { |a| a << ("bbbbb".size == 0 ? "empty" : "not empty") } # ["not empty"]
আপনার টার্নারি অপারেটর লিখার সময় মনে রাখার আরেকটি বিষয়!
ভিডিও টিউটোরিয়াল
সারসংক্ষেপ
আপনি রুবিতে টার্নারি কন্ডিশনাল অপারেটর সম্পর্কে শিখেছেন, এই অপারেটর আপনাকে কম্প্যাক্ট কন্ডিশনাল স্টেটমেন্ট লিখতে দেয় যা পরিস্থিতি অনুযায়ী আপনার কোডকে সহজ বা কঠিন করে দিতে পারে।
এখন আপনার পালা! যা শিখেছেন সেটি প্র্যাক্টিস করুন যাতে এই জ্ঞান আপনার ব্রেইনে ইনস্টল হয়।
পড়ার জন্য ধন্যবাদ 🙂