কেস (অন্য ভাষায় প্রায়ই যাকে switch বলা হয়) হলো if-else-এর মতো এক ধরনের কন্ট্রোল এক্সপ্রেশন। কেস একাধিক if-else-if স্টেটমেন্ট পরপর সাজানোর সুযোগ দেয় এবং ফ্লো কন্ট্রোল দিতে দিয়েও পড়তে বেশি সুবিধাজনক হতে পারে।
একটি কেস বোঝানো হয় case কিওয়ার্ড দিয়ে, তার পরে থাকে একটি ঐচ্ছিক এক্সপ্রেশন। এরপর প্রতিটি কেসের জন্য when কিওয়ার্ডটি ব্যবহার করা হয়, তার পরে থাকে একটি এক্সপ্রেশন, যা কেস এক্সপ্রেশনের সাথে তুলনা করা হয়। when কিওয়ার্ডটি case কিওয়ার্ড থেকে ইনডেন্ট করা উচিত নয়। when কিওয়ার্ডের পরে থাকে সেই কোড, যা কেস এক্সপ্রেশনটি when এক্সপ্রেশনের সাথে মিললে চালানো হয়। কেসে একটি ঐচ্ছিক else স্টেটমেন্ট থাকতে পারে, যা অন্য কোনো কেস না মিললে চালানো হয়।
কেস এক্সপ্রেশনটি মূল্যায়ন করা হয়, তারপর প্রতিটি when এক্সপ্রেশনের সাথে তুলনা করা হয়। এই তুলনা করা হয় কেস সমতা অপারেটর (===) দিয়ে।
value = 1
case value
when 1
"One"
when 2
"Two"
else
"Other"
end
# This is the same as:
value = 1
if 1 === value
"One"
elsif 2 === value
"Two"
else
"Other"
end
===)কেস সমতা অপারেটর (===) সমতা অপারেটর (==) থেকে একটু আলাদা। এই অপারেটরটি যাচাই করে যে ডান দিকেরটি বাম দিক বর্ণিত সেটের একটি সদস্য কি না। এর মানে হলো, প্রতিটি অপারেন্ড কোথায় বসছে সেটি গুরুত্বপূর্ণ। এটি কীভাবে কাজ করে তা নির্ভর করে বাম দিকের টাইপের উপর; উদাহরণস্বরূপ, একটি Range যাচাই করবে ডান দিকটি রেঞ্জের ভেতরে আছে কি না, আর একটি Object যাচাই করবে ডান দিকটি Object-এর একটি ইনস্ট্যান্স কি না।
(1..3) == 1 # => false
(1..3) === 1 # => true
String == "foo" # => false
String === "foo" # => true
কেসে একটি কেসের ভেতরেই একাধিক এক্সপ্রেশন মেলানো যায়, যেখানে প্রতিটি সম্ভাব্য মান কমা দিয়ে আলাদা করা থাকে। এক্সপ্রেশনগুলোর যেকোনো একটি মিললেই এটি কোডটি চালায়। একটি কেসেই একাধিক সম্ভাব্য মান চাইলে এটি কাজে লাগে।
case var
when 1, 2
"One or two"
else
"Other"
end
কেস দিয়ে কোনো মান রেঞ্জের ভেতরে আছে কি না, তাও যাচাই করা যায়। এটি করা হয় when এক্সপ্রেশন হিসেবে একটি রেঞ্জ ব্যবহার করে।
case var
when 1..3
puts "One to three"
else
puts "Other"
end
কেস এক্সপ্রেশনের প্রয়োজন না থাকলে সেটি বাদ দেওয়া যায়। এভাবে করলে প্রতিটি কেস এক্সপ্রেশন সত্যতা হিসেবে মূল্যায়ন করা হয়। আর তখন এগুলো if-else-if স্টেটমেন্টের মতো আচরণ করে।
case
when 1 == 1
"One is equal to one"
when 1 > 2
"One is greater than two"
else
"Other"
end
Ruby এক লাইনের কেস স্টেটমেন্টের সুযোগ দেয়। সরল এক লাইনের স্টেটমেন্ট থাকলে এটি ব্যবহার করা যায়। এক লাইনের when স্টেটমেন্ট লেখা হয় when <expression> then <statement> আকারে। আর else স্টেটমেন্টে ব্যবহার করলে লেখা হয় else <statement> আকারে।
case var
when 1 then "One"
when 2 then "Two"
else "Other"
end
কেস দিয়ে টাইপের সাথে মেলানোও যায়। কোনো ভ্যারিয়েবলের টাইপ অনুযায়ী আলাদা আচরণ চাইলে এটি কাজে লাগে।
case var
when Integer
"Integer"
when String
"String"
else
"Other"
end
এই অনুশীলনীতে আমরা একটি ব্ল্যাকজ্যাক গেমের প্রথম চাল অনুকরণ করব।
আপনি দুটি কার্ড পাবেন এবং ডিলারের খোলা কার্ডটি দেখতে পাবেন। সব কার্ডকে "ace", "king", "three", "two" ইত্যাদির মতো একটি স্ট্রিং দিয়ে প্রকাশ করা হয়। প্রতিটি কার্ডের মান হলো:
| কার্ড | মান | কার্ড | মান |
|---|---|---|---|
| ace | ১১ | eight | ৮ |
| two | ২ | nine | ৯ |
| three | ৩ | ten | ১০ |
| four | ৪ | jack | ১০ |
| five | ৫ | queen | ১০ |
| six | ৬ | king | ১০ |
| seven | ৭ | other | ০ |
সাধারণত ace-এর মান ১ বা ১১ হতে পারে, কিন্তু সহজ রাখতে আমরা ধরে নেব যে এর মান কেবল ১১-ই হতে পারে।
Blackjack.parse_card মেথডটি ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে একটি কার্ড স্ট্রিং নেয়।
মেথডটি কার্ডের মানটি একটি ইন্টিজার হিসেবে রিটার্ন করবে।
Blackjack.parse_card("ace")
# => 11
প্লেয়ারের স্কোরকে মানের রেঞ্জে ভাগ করতে হবে। প্লেয়ারের স্কোর হিসাব করা হয় প্লেয়ারের দুটি কার্ডের মান যোগ করে। যে রেঞ্জগুলো ব্যবহার করা হয় সেগুলো হলো:
| রেঞ্জ | মান |
|---|---|
| low | [৪, ১১] |
| mid | [১২, ১৬] |
| high | [১৭, ২০] |
| blackjack | [২১] |
Blackjack.card_range মেথডটি ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে দুটি কার্ড স্ট্রিং নেয়।
মেথডটি রিটার্ন করবে দুটি কার্ড যে মানের রেঞ্জে পড়ে তার নাম।
Blackjack.card_range("ten", "king")
# => "high"
আপনার দুটি কার্ড এবং ডিলারের কার্ডের উপর নির্ভর করে গেমের প্রথম চালের জন্য একটি স্ট্র্যাটেজি আছে, যেখানে আপনার কাছে নিচের অপশনগুলো থাকে:
যদিও এটি এখনো অপ্টিমাল নয়, তবুও আপনি আপনার বন্ধু Alex-এর তৈরি করা স্ট্র্যাটেজিটি অনুসরণ করবেন, যা নিচের মতো:
Blackjack.first_turn মেথডটি ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে তিনটি কার্ড স্ট্রিং নেয়।
মেথডটি আপনার নেওয়া সিদ্ধান্তটি একটি স্ট্রিং হিসেবে রিটার্ন করবে।
Blackjack.first_turn("ace", "ace", "two")
# => "P"
Exercism-এ সাইন আপ করুন, Ruby ট্র্যাকের 21টি কনসেপ্ট121টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।