रेंज दो वैल्यू के बीच के अंतराल को दर्शाती है।
रेंज का इस्तेमाल सबसे आम तौर पर 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
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"
रेंज के साथ काम करने के लिए उनमें कई मेथड होते हैं। जैसे, इन मेथड की मदद से आप रेंज की सभी वैल्यू का जोड़ निकाल सकते हैं या यह जाँच सकते हैं कि कोई वैल्यू रेंज में शामिल है या नहीं।
| मेथड | विवरण | उदाहरण |
|---|---|---|
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"]
शतरंज के शौकीन होने के नाते आप खेल का अपना खुद का संस्करण लिखना चाहेंगे। हाँ, हो सकता है कि इंटरनेट पर शतरंज के कई प्रोग्राम पहले से मौजूद हों, लेकिन आपका प्रोग्राम अनोखा होगा!
सबसे पहले आप मोहरों के चलने का एक बुनियादी सिस्टम बनाएँगे।
शतरंज का यह खेल एक ऐसे बोर्ड पर खेला जाएगा, जो 8 खानों चौड़ा और 8 खानों लंबा होगा। हर खाने की पहचान एक अक्षर और एक संख्या से होती है।
खेल को बोर्ड की रैंक भी संग्रहीत करनी होगी। रैंक बोर्ड की पंक्तियाँ हैं, और उन्हें 1 से 8 तक संख्या दी जाती है।
खेल को बोर्ड की फाइल भी संग्रहीत करनी होगी। फाइल बोर्ड के स्तंभ हैं, और उनकी पहचान A से H तक के अक्षरों से होती है।
Chess::RANKS और Chess::FILES कॉन्स्टेंट बनाइए, जो क्रमशः रैंक और फाइल की रेंज संग्रहीत करते हैं।
Chess::RANKS
# => 1..8
Chess::FILES
# => 'A'..'H'
खेल को जाँचना होगा कि कोई खाना मान्य है या नहीं। कोई खाना तब मान्य होता है जब उसकी रैंक और फाइल, रैंक और फाइल की रेंज के अंदर हों।
Chess.valid_square? मेथड बनाइए, जो rank और file आर्गुमेंट लेता है। rank में रैंक का एक पूर्णांक रहता है और file में फाइल का एक अक्षर। अगर रैंक और फाइल, रैंक और फाइल की रेंज के अंदर हैं तो मेथड true लौटाता है, वरना false लौटाता है।
Chess.valid_square?(1, 'A')
# => true
खेल को खिलाड़ी का उपनाम निकालना होगा। उपनाम, खिलाड़ी के पहले नाम के पहले 2 अक्षरों और उसके अंतिम नाम के अंतिम 2 अक्षरों से बनता है। उपनाम अंग्रेज़ी के बड़े अक्षरों में होना चाहिए।
Chess.nickname मेथड बनाइए, जो first_name और last_name आर्गुमेंट लेता है। 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 आर्गुमेंट लेता है। first_name में खिलाड़ी के पहले नाम की स्ट्रिंग, last_name में उसके अंतिम नाम की स्ट्रिंग, और square में उस खाने की स्ट्रिंग रहती है जहाँ खिलाड़ी गया। मेथड को चाल का संदेश स्ट्रिंग के रूप में लौटाना चाहिए।
Chess.move_message("John", "Doe", "A1")
# => "JOOE moved to A1"
Exercism पर साइन अप कीजिए और Ruby को 21 कॉन्सेप्ट121 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।