रेंज दो वैल्यू के बीच के अंतराल को दर्शाती है।
रेंज को सबसे अधिक 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>