रूबी में रेंज क्या है और यह कैसे काम करती है?
एक श्रेणी एक ऐसी वस्तु है जिसका प्रारंभिक मूल्य और समाप्ति मूल्य होता है, वे आपको अनुक्रम बनाने में मदद करते हैं जो इन दो मानों के बीच पूरी श्रृंखला को फैलाते हैं।
आप 1
. से जा सकते हैं करने के लिए 20
, या "a"
. से करने के लिए "z"
।
इस लेख में आप जानेंगे :
- रूबी रेंज कैसे बनाएं
step
का उपयोग कैसे करें &include?
रूबी में तरीके- श्रेणियां कैसे काम करती हैं
चलो यह करते हैं!
श्रेणियों को समझना
एक अनुस्मारक के रूप में, रूबी रेंज सिंटैक्स इस तरह दिखता है:
(1..20)
Range
. को परिभाषित करने के लिए कोष्ठक आवश्यक नहीं है ।
लेकिन अगर आप अपनी सीमा पर विधियों को कॉल करना चाहते हैं तो आपको उनकी आवश्यकता होगी। अन्यथा, आप विधि को श्रेणी के बजाय, श्रेणी के दूसरे तत्व पर बुला रहे हैं।
Range
क्लास में एन्यूमरेबल शामिल है, इसलिए आपको रेंज को किसी ऐरे में बदले बिना सभी शक्तिशाली इटरेशन मेथड्स मिलते हैं।
रूबी चरण विधि
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
लौटाता है क्या यह है कि स्ट्रिंग्स की तुलना चरित्र के अनुसार की जाती है . चूंकि "ए" "सी" से पहले आता है, इसलिए पहले "सी" के बाद आने वाले अक्षर मायने नहीं रखते।
रूबी में रेंज कैसे लागू की जाती हैं
रेंज केवल संख्याओं और अक्षरों तक सीमित नहीं हैं, आप किसी भी ऑब्जेक्ट का उपयोग तब तक कर सकते हैं जब तक वे निम्नलिखित विधियों को लागू करते हैं:<=>
और succ
।
उदाहरण के लिए, यहाँ एक दिनांक समय सीमा है:
require 'time' t1 = DateTime.new t2 = DateTime.new + 30 next_30_days = t1..t2 # Example use next_30_days.select(&:friday?).map(&:day)
यह कैसे काम करता है? आइए इस कार्यान्वयन पर एक नज़र डालें:
def range(a, b) # if the first element is bigger than the second # then this isn't a sequential range return [] if a > b out = [] # advance until the 2nd element is the same # as the first one while a != b out << a a = a.next end # add last element (inclusive range) # this also returns the results via implicit return out << a end p range 1, 10 p range 'a', 'z'
क्या हो रहा है इसे समझने में आपकी सहायता के लिए मैंने कुछ टिप्पणियां जोड़ीं।
विचार यह है कि हम अगली विधि को पहली वस्तु पर तब तक बुलाते रहते हैं जब तक कि यह दूसरी वस्तु के बराबर न हो, धारणा यह है कि वे अंततः मिलेंगे।
कस्टम क्लास रेंज
अधिकांश समय आप संख्या और वर्ण श्रेणियों का उपयोग कर रहे होंगे, लेकिन यह जानना अभी भी अच्छा है कि आप कस्टम वर्ग में श्रेणियों का उपयोग कैसे कर सकते हैं।
उदाहरण :
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) # Print array with all the items in the range p Array(a..b)
यहां कुंजी यह सुनिश्चित करने के लिए है कि आप <=>
. को लागू करते हैं &succ
तरीके सही हैं।
यदि आप include?
. का उपयोग करना चाहते हैं Comparable
. को शामिल करने के लिए आपको जिस विधि की आवश्यकता है मॉड्यूल, जो ==
. जैसी विधियों को जोड़ता है , <
, और >
(सभी <=>
. के नतीजों पर आधारित हैं विधि)।
निष्कर्ष
इस लेख में आपने सीखा है कि रूबी में श्रेणियां कैसे काम करती हैं ताकि आप उन्हें बेहतर ढंग से समझ सकें और अपनी खुद की वस्तुओं को लागू कर सकें जो रेंज संचालन का समर्थन करती हैं।
नीचे दिए गए न्यूज़लेटर की सदस्यता लेना न भूलें ताकि आप अगली पोस्ट से न चूकें 🙂