রেঞ্জ হলো দুটি মানের মধ্যবর্তী একটি ব্যবধান।
রেঞ্জ সমর্থন করে এমন সবচেয়ে কমন টাইপগুলো হলো Integer এবং String।
এগুলো অনেক কাজে ব্যবহার করা যায়, যেমন দ্রুত একটি কালেকশন তৈরি করা, স্ট্রিং স্লাইস করা, কোনো মান রেঞ্জের মধ্যে আছে কি না তা চেক করা, আর ইটারেশন।
এগুলো তৈরি করা হয় রেঞ্জ অপারেটর .. বা ... দিয়ে (যথাক্রমে ইনক্লুসিভ ও এক্সক্লুসিভ)।
1..5 # => 1..5
1...5 # => 1...5
(1..5).to_a # => [1, 2, 3, 4, 5]
(1...5).to_a # => [1, 2, 3, 4]
দুটি রেঞ্জ অপারেটর থাকার কারণ হলো শেষ মানসহ বা শেষ মান ছাড়া রেঞ্জ তৈরি করার সুযোগ দেওয়া, যা কাজে লাগে যেমন জিরো-বেজড ইনডেক্স নিয়ে কাজ করার সময়।
Range কনস্ট্রাক্টর new ব্যবহার করেও রেঞ্জ তৈরি করা যায়।
Range.new(1, 5) # A range containing 1, 2, 3, 4, 5
রুবিতে .. বা ... রেঞ্জ অপারেটর দিয়ে একটি রেঞ্জ তৈরি করার সময় যদি আপনি রেঞ্জের ওপর কোনো মেথড কল করতে চান, তাহলে রেঞ্জটিকে বন্ধনীর মধ্যে রাখতে হবে।
কারণ অন্যথায় মেথডটি রেঞ্জ অপারেটরের দ্বিতীয় আর্গুমেন্টের ওপর কল হবে।
(1..5).sum # => 15
1..5.sum # => Error: undefined method `sum' for 5:Integer (NoMethodError)
স্ট্রিং স্লাইস করতে চাইলে সাবস্ট্রিং পেতে রেঞ্জ অপারেটর ব্যবহার করা যায়। অর্থাৎ, সাবস্ট্রিংয়ের শুরু ও শেষ ইনডেক্স দিয়ে একটি রেঞ্জ তৈরি করে।
"Hello World"[0..4] # => "Hello"
"Hello World"[6..10] # => "World"
স্ট্রিংয়ের শেষ থেকে সাবস্ট্রিং পেতে নেগেটিভ ইনডেক্সও ব্যবহার করা যায়।
"Hello World"[-5..-1] # => "World"
"Hello World"[6..-4] # => "Wo"
রেঞ্জের সাথে কাজ করার জন্য কিছু মেথড আছে। যেমন, এসব মেথড দিয়ে রেঞ্জের সব মানের যোগফল পাওয়া যায় বা রেঞ্জে কোনো মান আছে কি না তা চেক করা যায়।
| মেথড | বর্ণনা | উদাহরণ |
|---|---|---|
sum |
রেঞ্জের সব মানের যোগফল রিটার্ন করে | (1..5).sum # => 15 |
size |
রেঞ্জের আকার রিটার্ন করে | (1..5).size # => 5 |
include? |
রেঞ্জে প্রদত্ত মান থাকলে true, অন্যথায় false রিটার্ন করে |
(1..5).include?(3) # => true |
একটি রেঞ্জ এন্ডলেস ও বিগিনলেস হতে পারে।
এন্ডলেস বা বিগিনলেস রেঞ্জের শুরু বা শেষ মান nil হয়, তবে রেঞ্জ ডিফাইন করার সময় nil বাদ দেওয়া যায়।
বিগিনলেস ও এন্ডলেস রেঞ্জ কাজে লাগে যখন আপনি চান, যেমন, স্ট্রিংয়ের শুরু থেকে বা শেষ পর্যন্ত স্লাইস করতে।
"Hello World"[0..] # => "Hello World"
"Hello World"[4..] # => "o World"
"Hello World"[..5] # => "Hello "
কোনো কালেকশনের ওপর ব্যবহার না করলে, সাবধান না থাকলে এন্ডলেস রেঞ্জ একটি এন্ডলেস সিকোয়েন্স তৈরি করতে পারে।
স্ট্রিংও রেঞ্জে ব্যবহার করা যায়, আর এভাবে দুই স্ট্রিংয়ের মধ্যবর্তী স্ট্রিংয়ের ইন্টারভাল পাওয়া যায়। কিছু স্ট্রিং ব্যবহার করলে এর আচরণ একটু অপ্রত্যাশিত হতে পারে, তাই সাবধানে ব্যবহার করুন।
("aa".."az").to_a # => ["aa", "ab", "ac", ..., "az"]
দাবা খেলার একজন অনুরাগী হিসেবে আপনি খেলাটি নিজের একটি সংস্করণ লিখতে চান। হ্যাঁ, অনলাইনে ইতিমধ্যেই দাবার অনেক বাস্তবায়ন পাওয়া যায়, কিন্তু আপনারটি হবে অনন্য!
আপনি শুরু করবেন গুটিগুলোর জন্য একটি মৌলিক চলাচল ব্যবস্থা বাস্তবায়ন দিয়ে।
দাবা খেলাটি খেলা হবে এমন একটি বোর্ডে, যেটি ৮ ঘর চওড়া ও ৮ ঘর লম্বা। প্রতিটি ঘর একটি অক্ষর ও একটি সংখ্যা দিয়ে চিহ্নিত করা হয়।
গেমটিকে বোর্ডের র্যাঙ্কগুলো সংরক্ষণ করতে হবে। র্যাঙ্কগুলো হলো বোর্ডের সারি, যেগুলো ১ থেকে ৮ পর্যন্ত সংখ্যায়িত।
গেমটিকে বোর্ডের ফাইলগুলোও সংরক্ষণ করতে হবে। ফাইলগুলো হলো বোর্ডের কলাম, যেগুলো A থেকে H অক্ষর দিয়ে চিহ্নিত করা হয়।
যথাক্রমে র্যাঙ্ক ও ফাইলের রেঞ্জ সংরক্ষণ করে এমন Chess::RANKS ও Chess::FILES কনস্ট্যান্ট ডিফাইন করুন।
Chess::RANKS
# => 1..8
Chess::FILES
# => 'A'..'H'
গেমটিকে যাচাই করতে হবে একটি ঘর বৈধ কি না। কোনো ঘর বৈধ হয় যদি তার র্যাঙ্ক ও ফাইল র্যাঙ্ক ও ফাইলগুলোর রেঞ্জের ভেতরে থাকে।
Chess.valid_square? মেথডটি ডিফাইন করুন, যা আর্গুমেন্ট হিসেবে নেয় rank (যেটিতে র্যাঙ্কের একটি ইন্টিজার থাকে) এবং file (যেটিতে ফাইলের একটি ক্যারেক্টার থাকে)।
মেথডটি true রিটার্ন করবে যদি র্যাঙ্ক ও ফাইল র্যাঙ্ক ও ফাইলগুলোর রেঞ্জের ভেতরে থাকে, আর অন্যথায় false রিটার্ন করবে।
Chess.valid_square?(1, 'A')
# => true
গেমটিকে খেলোয়াড়ের ডাকনাম নিতে হবে। ডাকনাম হলো খেলোয়াড়ের প্রথম নামের প্রথম ২টি ক্যারেক্টার এবং শেষ নামের শেষ ২টি ক্যারেক্টার। ডাকনামটি বড় হাতের অক্ষরে লেখা হবে।
Chess.nickname মেথডটি ডিফাইন করুন, যা আর্গুমেন্ট হিসেবে নেয় first_name (যেটিতে খেলোয়াড়ের প্রথম নামের একটি স্ট্রিং থাকে) এবং last_name (যেটিতে খেলোয়াড়ের শেষ নামের একটি স্ট্রিং থাকে)।
মেথডটি খেলোয়াড়ের ডাকনাম বড় হাতের অক্ষরের স্ট্রিং হিসেবে রিটার্ন করবে।
Chess.nickname("John", "Doe")
# => "JOOE"
গেমটিকে একটি চালের জন্য বার্তা তৈরি করতে হবে, যাতে বলা থাকবে কোন খেলোয়াড় কোন ঘরে গেছে। বার্তায় খেলোয়াড়ের ডাকনাম এবং সে যে ঘরে গেছে সেটি ব্যবহার করতে হবে। গেমটিকে আরও নির্ধারণ করতে হবে চালটি বৈধ কি না, অর্থাৎ ঘরটির ফাইল ও র্যাঙ্ক ফাইল ও র্যাঙ্কগুলোর রেঞ্জের ভেতরে আছে কি না তা যাচাই করে।
চালটি বৈধ হলে বার্তাটি হবে: "{nickname} moved to {square}"
চালটি অবৈধ হলে বার্তাটি হবে: "{nickname} attempted to move to {square}, but that is not a valid square"
Chess.move_message মেথডটি ডিফাইন করুন, যা আর্গুমেন্ট হিসেবে নেয় first_name (যেটিতে খেলোয়াড়ের প্রথম নামের একটি স্ট্রিং থাকে), last_name (যেটিতে খেলোয়াড়ের শেষ নামের একটি স্ট্রিং থাকে) এবং square (যেটিতে খেলোয়াড় যে ঘরে গেছে সেই ঘরের একটি স্ট্রিং থাকে)।
মেথডটি চালের বার্তাটি একটি স্ট্রিং হিসেবে রিটার্ন করবে।
Chess.move_message("John", "Doe", "A1")
# => "JOOE moved to A1"
Exercism-এ সাইন আপ করুন, Ruby ট্র্যাকের 21টি কনসেপ্ট121টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।