রেঞ্জ দুটি মানের মধ্যবর্তী একটি ব্যবধান বোঝায়।
রেঞ্জ সমর্থন করে এমন সবচেয়ে কমন টাইপ হলো 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 ইনিশিয়ালাইজার দিয়েও রেঞ্জ তৈরি করা যায়।
Range.new(1, 5) # A range containing 1, 2, 3, 4, 5
Ruby-তে .. বা ... রেঞ্জ অপারেটর দিয়ে রেঞ্জ তৈরি করার সময়, আর সেই রেঞ্জের ওপর কোনো মেথড কল করতে চাইলে, রেঞ্জটি বন্ধনীর মধ্যে রাখতে হবে।
কারণ অন্যথায় মেথডটি রেঞ্জ অপারেটরের দ্বিতীয় আর্গুমেন্টের ওপর কল হয়ে যাবে।
(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"
রেঞ্জের সাথে কাজ করার জন্য এর একগুচ্ছ মেথড আছে। যেমন, এই মেথডগুলো দিয়ে রেঞ্জের সব মানের যোগফল পাওয়া যায় বা রেঞ্জে কোনো মান আছে কি না তা যাচাই করা যায়।
| Method | Description | Example |
|---|---|---|
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"]
Ruby-তে রেঞ্জে কাস্টম অবজেক্ট ব্যবহার করা যায়। এর জন্য প্রয়োজন হলো অবজেক্টটি নিচের জিনিসগুলো ইমপ্লিমেন্ট করবে:
Comparable মডিউল ইনক্লুড করাsucc মেথড<=> মেথডএই মেথডগুলো থাকলে রেঞ্জটি অবজেক্টের ওপর ইটারেট করতে এবং রেঞ্জের অবজেক্টগুলো তুলনা করতে পারে।
class Foo
include Comparable
attr_reader :value
def initialize(value)
@value = value
end
def succ
Foo.new(value + 1)
end
def <=>(other)
value <=> other.value
end
end
(Foo.new(1)..Foo.new(5))
# => #<Foo:0x7f3552bebe70 @value=1>, #<Foo:0x7f3552bebe50 @value=2>, #<Foo:0x7f3552bebe40 @value=3>, #<Foo:0x7f3552bebe30 @value=4>, #<Foo:0x7f3552bebe20 @value=5>