কেস স্টেটমেন্ট থেকে সিম্পলার এবং बोরিং কিছু নেই। এটি C-র একটি হোল্ডओভার। আপনি এটি বানচ অব if-else রিপ্লেস করতে ব্যবহার করেন। কেস ক্লোজড। নাকি?
আসলে, রুবিতে কেস স্টেটমেন্টগুলো আপনি কল্পনা করুন তার চেয়ে অনেক রিচার এবং কমপ্লেক্স। চলুন শুধু একটি উদাহরণ দেখি:
case "Hi there" when String puts "case statements match class" end # outputs: "case statements match class" এই উদাহরণ দেখাচ্ছে যে কেস স্টেটমেন্ট শুধু একটি আইটেমের ভ্যালু ম্যাচ করে না, বরং এর ক্লাস-ও ম্যাচ করে। এটি সম্ভব কারণ আন্ডার দ্য হুড, রুবি === অপারেটর ব্যবহার করে, যাকে three equals operator বলা হয়।
=== অপারেটরের একটি কুইক ট্যুর
যখন আপনি রুবিতে x === y লিখেন, আপনি জিজ্ঞাসা করছেন "y কি x দ্বারা রিপ্রেজেন্টেড গ্রুপে বেলঙ করে?" এটি একটি খুব জেনারেল স্টেটমেন্ট। স্পেসিফিক্স ভিন্ন হয়, আপনি কোন ধরনের গ্রুপের সাথে কাজ করছেন সেটির ওপর নির্ভর করে।
# এখানে, Class.===(item) মেথড কল হয়, যা true রিটার্ন করে যদি item ক্লাসের ইনস্ট্যান্স হয় String === "hello" # true String === 1 # false স্ট্রিংস, রেগুলার এক্সপ্রেশন এবং রেঞ্জগুলো তাদের নিজস্ব ===(item) মেথড ডিফাইন করে, যা মোর অর লেস আপনার আশা অনুযায়ী আচরণ করে। আপনি আপনার নিজস্ব ক্লাসেও ট্রিপল ইক্যুয়ালস মেথড যোগ করতে পারেন।
এখন যেহেতু আমরা এটা জানি, আমরা কেস দিয়ে সব ধরনের ট্রিক করতে পারি।
কেস স্টেটমেন্টে রেঞ্জ ম্যাচ করা
আপনি কেস স্টেটমেন্টে রেঞ্জ ব্যবহার করতে পারেন, কারণ range === n শুধু range.include?(n) এর ভ্যালু রিটার্ন করে। আমি কীভাবে নিশ্চিত হয়েছি? এটি ডক্সে রয়েছে।
case 5 when (1..10) puts "case statements match inclusion in a range" end # outputs "case statements match inclusion in a range" কেস স্টেটমেন্টে রেগুলার এক্সপ্রেশন ম্যাচ করা
কেস স্টেটমেন্টে regex ব্যবহার করাও সম্ভব, কারণ /regexp/ === "string" শুধু তখন true রিটার্ন করে যখন স্ট্রিং রেগুলার এক্সপ্রেশনটির সাথে ম্যাচ করে। Regexp-র ডক্স এটি ব্যাখ্যা করে।
case "FOOBAR" when /BAR$/ puts "they can match regular expressions!" end # outputs "they can match regular expressions!" প্রক এবং ল্যাম্বডা ম্যাচ করা
এটি একটু weird। যখন আপনি Proc#===(item) ব্যবহার করেন, এটি Proc#call(item) করার সমান। ডক্স এখানে রয়েছে। এর মানে আপনি আপনার কেস স্টেটমেন্টে ল্যাম্বডা এবং প্রক ব্যবহার করতে পারেন ডাইনামিক ম্যাচার হিসেবে।
case 40 when -> (n) { n.to_s == "40" } puts "lambdas!" end # outputs "lambdas" আপনার নিজস্ব ম্যাচার ক্লাস লিখা
আমি যেমন আগে বললাম, আপনার ক্লাসে কাস্টম কেস আচরণ যোগ করা उतনোই সিম্পল যতো আপনার নিজস্ব === মেথড ডিফাইন করা। এর একটি ব্যবহার হতে পারে কমপ্লেক্স কন্ডিশনাল লজিককে একাধিক ছোট ক্লাসে পুল আউট করা। নিচে আমি স্কেচ করলাম সেটি কীভাবে কাজ করতে পারে:
class Success def self.===(item) item.status >= 200 && item.status < 300 end end class Empty def self.===(item) item.response_size == 0 end end case http_response when Empty puts "response was empty" when Success puts "response was a success" end