रूबी में रेंज क्या है और यह कैसे काम करती है?
एक रेंज एक ऑब्जेक्ट है जिसमें एक प्रारंभिक मान और एक अंतिम मान होता है, ये उन दो मानों के बीच पूरे रेंज में फैले अनुक्रम बनाने में आपकी मदद करते हैं।
आप 1 से 20 तक जा सकते हैं, या "a" से "z" तक।
इस लेख में आप खोजेंगे:
- रूबी रेंज कैसे बनाएं
- रूबी में
stepऔरinclude?मेथड्स का उपयोग कैसे करें - रेंज हुड के नीचे कैसे काम करती हैं
चलिए शुरू करते हैं!
रेंज को समझना
बस एक रिमाइंडर के रूप में, रूबी रेंज सिंटैक्स ऐसा दिखता है:
(1..20)
पैरेंथेसिस Range को परिभाषित करने के लिए आवश्यक नहीं हैं।
लेकिन अगर आप अपने रेंज पर मेथड्स कॉल करना चाहते हैं तो आपको उनकी आवश्यकता होगी। अन्यथा, आप रेंज के दूसरे एलिमेंट पर मेथड कॉल कर रहे हैं, रेंज पर नहीं।
Range क्लास Enumerable शामिल करती है, इसलिए आपको रेंज को सरणी में बदले बिना सभी शक्तिशाली पुनरावृति मेथड्स मिलते हैं।
रूबी स्टेप मेथड
Range में कुछ उपयोगी मेथड्स हैं, जैसे step मेथड।
उदाहरण:
(10..20).step(2).to_a # [10, 12, 14, 16, 18, 20]
इस मेथड का उपयोग करके आप रेंज पर n की वृद्धि में पुनरावृति कर सकते हैं, जहां n वह तर्क है जो step को पास किया जाता है।
कैसे पता करें कि कोई नंबर रेंज के अंदर है या नहीं
अन्य Range मेथड्स जिनके बारे में पता होना चाहिए: cover? और include?।
यह सोचना गलती होगी कि वे एक ही काम करते हैं, क्योंकि वे नहीं करते।
include? मेथड वही करता है जिसकी आप उम्मीद करते हैं, रेंज के अंदर समावेश की जांच करता है। तो यह Range को Array में विस्तारित करने और जांचने के बराबर होगा कि क्या कुछ वहां है।
लेकिन cover? अलग है, यह केवल रेंज के प्रारंभिक और अंतिम मानों के खिलाफ जांच करता है (begin <= obj <= end), जो अप्रत्याशित परिणाम दे सकता है।
उदाहरण:
('a'..'z').include? "cc" # false
('a'..'z').cover? "cc" # true
cover? उदाहरण इसके बराबर है:
"a" <= "cc" && "cc" <= "z"
यह true लौटाता है क्योंकि स्ट्रिंग्स की तुलना वर्ण दर वर्ण की जाती है। चूंकि "a" "c" से पहले आता है, इसलिए पहले "c" के बाद आने वाले वर्ण मायने नहीं रखते।
रूबी में रेंज कैसे लागू की जाती हैं
रेंज संख्याओं और अक्षरों तक सीमित नहीं हैं, आप किसी भी ऑब्जेक्ट का उपयोग कर सकते हैं जब तक वे निम्नलिखित मेथड्स को लागू करते हैं: <=> और succ।
उदाहरण के लिए, यहां एक DateTime रेंज है:
require 'time' t1 = DateTime.new t2 = DateTime.new + 30 next_30_days = t1..t2 # उदाहरण उपयोग next_30_days.select(&:friday?).map(&:day)
तो यह कैसे काम करता है? आइए इस कार्यान्वयन पर एक नज़र डालते हैं:
def range(a, b)
# यदि पहला एलिमेंट दूसरे से बड़ा है
# तो यह एक क्रमिक रेंज नहीं है
return [] if a > b
out = []
# तब तक आगे बढ़ें जब तक दूसरा एलिमेंट
# पहले के समान न हो जाए
while a != b
out << a
a = a.next
end
# अंतिम एलिमेंट जोड़ें (समावेशी रेंज)
# यह निहित रिटर्न के माध्यम से परिणाम भी लौटाता है
out << a
end
p range 1, 10
p range 'a', 'z'
मैंने आपको यह समझने में मदद करने के लिए कुछ टिप्पणियाँ जोड़ी हैं कि क्या हो रहा है।
विचार यह है कि हम पहले ऑब्जेक्ट पर next मेथड को तब तक कॉल करते रहते हैं जब तक यह दूसरे के बराबर नहीं हो जाता, धारणा यह है कि वे अंततः मिलेंगे।
कस्टम क्लास रेंज
अधिकांश समय आप संख्या और वर्ण रेंज का उपयोग करेंगे, लेकिन यह जानना अभी भी अच्छा है कि आप कस्टम क्लास में रेंज का उपयोग कैसे कर सकते हैं।
उदाहरण:
class LetterMultiplier
attr_reader :count
include Comparable
def initialize(letter, count)
@letter = letter
@count = count
end
def succ
self.class.new(@letter, @count + 1)
end
def <=>(other)
count <=> other.count
end
end
a = LetterMultiplier.new('w', 2)
b = LetterMultiplier.new('w', 8)
# रेंज में सभी आइटम्स के साथ सरणी प्रिंट करें
p Array(a..b)
यहां कुंजी यह सुनिश्चित करना है कि आप <=> और succ मेथड्स को सही ढंग से लागू करते हैं।
यदि आप include? मेथड का उपयोग करना चाहते हैं तो आपको Comparable मॉड्यूल को शामिल करने की आवश्यकता है, जो ==, <, और > जैसे मेथड्स जोड़ता है (सभी <=> मेथड के परिणामों पर आधारित)।
निष्कर्ष
इस लेख में आपने सीखा कि रूबी में रेंज कैसे काम करती हैं ताकि आप उन्हें बेहतर ढंग से समझ सकें और अपने खुद के ऑब्जेक्ट्स को लागू कर सकें जो रेंज ऑपरेशन्स का समर्थन करते हैं।
नीचे दिए गए फॉर्म में न्यूज़लेटर की सदस्यता लेना न भूलें ताकि आप अगली पोस्ट से न चूकें 🙂