आप एक पूर्णांक के साथ काम कर रहे हैं लेकिन आप स्ट्रिंग विधियों का उपयोग करना चाहेंगे (जैसे gsub ) इसके बजाय।
आप क्या कर सकते हैं?
इसे एक स्ट्रिंग में बदलें (to_s . के साथ) ) फिर इसे वापस एक पूर्णांक में बदलें (to_i . के साथ) )।
उदाहरण के लिए :
आप Integer को रूपांतरित कर सकते हैं 1 से String "1"।
फिर आप नई कक्षा के तरीकों का उपयोग कर सकते हैं, जो आपको कुछ ऐसा करने में मदद करता है जो पहले संभव नहीं था।
याद रखें कि रूबी में…
प्रत्येक वस्तु एक वर्ग से जुड़ी होती है, और प्रत्येक वर्ग में विधियों का एक विशिष्ट समूह होता है।
इस लेख में, आप इसके बारे में जानेंगे :
- रूबी में कौन सी रूपांतरण विधियां उपलब्ध हैं
- उनके बीच क्या अंतर हैं!
- विभिन्न परिस्थितियों में सही का चुनाव कैसे करें
चलो यह करते हैं!
लघु रूपांतरण विधियां (to_s, to_i)
आप रूपांतरण विधियों के इस पहले समूह से शायद परिचित हैं।
तरीके जैसे :
- to_i
- to_s
- to_a
ये विधियां एक विशिष्ट वर्ग की एक नई वस्तु लौटाती हैं जो वर्तमान वस्तु का प्रतिनिधित्व करती है।
उदाहरण के लिए :
(1..10).to_a # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
यह कहता है :
<ब्लॉकक्वॉट>
“मैं Range को कन्वर्ट करना चाहता हूं 1..10 एक Array . में जो उस सीमा का प्रतिनिधित्व करता है।"
ऐसे कई तरीके हैं जिनसे रूबी इन रूपांतरण विधियों को आपके लिए परोक्ष रूप से बुलाती है।
जैसे स्ट्रिंग इंटरपोलेशन में:
"#{1}"
यह 1.to_s . को कॉल करता है आपके लिए, भले ही आप इसे न देखें।
आप इस कोड से स्वयं की जांच कर सकते हैं :
module Log
def to_s
puts "to_s called"
super
end
end
class Integer
prepend Log
end
puts "#{1}"
# "to_s called"
<ब्लॉकक्वॉट>
नोट :आपको Fixnum . का उपयोग करना होगा Integer . के बजाय यदि आप रूबी 2.3 या पुराने पर हैं। या बेहतर अभी तक, अपने रूबी संस्करण को अपडेट करें 🙂
ये तरीके काफी अनुमेय हैं और इनसे कोई अपवाद नहीं होना चाहिए।
उदाहरण के लिए :
"aaaaaa".to_i # 0
यह 0 आपको चौंका सकता है।
लेकिन जब आप to_i . पर कॉल करते हैं तो आपको यही मिलता है एक स्ट्रिंग पर उस पर पूर्णांकों के बिना।
जैसा कि आप इस लेख में बाद में देखेंगे इस पद्धति का अधिक सख्त संस्करण है ।
लंबी रूपांतरण विधियां (to_str, to_int)
अब:
यदि हमारे पास वे छोटी रूपांतरण विधियां हैं, तो हमें to_str . जैसी विधियों की आवश्यकता क्यों है? , या to_int ?
क्या अंतर है?
अंतर उनके इरादे में है।
प्रत्येक रूबी वर्ग (BasicObject . के अपवाद के साथ) ) to_s . को लागू करता है किसी प्रकार के स्ट्रिंग प्रतिनिधित्व के रूप में स्वयं को वापस करने की विधि।
लेकिन सिर्फ इसलिए कि एक वर्ग एक स्ट्रिंग लौटाता है इसका मतलब यह नहीं है कि यह एक स्ट्रिंग की तरह व्यवहार करता है!
आइए एक उदाहरण देखें :
"" + 1 # TypeError: no implicit conversion of Fixnum into String
इसके बारे में सोचें :
एक खाली स्ट्रिंग प्लस पूर्णांक क्या लौटाना चाहिए?
मुझे नहीं पता।
आप "1" (नंबर एक के साथ एक स्ट्रिंग) कह सकते हैं।
लेकिन क्यों?
इस मामले में ज़्यादातर लोग ऐसी उम्मीद नहीं करते हैं।
उन्हें जोड़ने का कोई मतलब नहीं है... इसलिए हमें यह TypeError मिलता है ।
और भले ही इसकी अनुमति हो।
इसके बारे में क्या :
"" + {}
यह एक खाली स्ट्रिंग और एक खाली हैश है।
इसका भी कोई मतलब नहीं है!
इसलिए रूबी यह जाँचने के बजाय कि क्या दूसरी वस्तु एक स्ट्रिंग है, जो बहुरूपता के लिए अच्छा नहीं होगा, यह जाँचता है कि क्या यह एक स्ट्रिंग की तरह कार्य करता है।
वहीं to_str विधि आती है।
एकमात्र वर्ग जो रूबी 2.5 में to_str लागू करते हैं :
StringNameError::messageWarning::buffer
अपनी खुद की रूपांतरण विधियों को कैसे लागू करें
आप to_str implement को लागू कर सकते हैं किसी भी कक्षा में।
तब आप इसे एक स्ट्रिंग की तरह इस्तेमाल कर पाएंगे।
यहां एक उदाहरण दिया गया है :
class Cat
def to_str
"meow"
end
end
"" + Cat.new
# "meow"
लेकिन जब तक आपकी कक्षा एक स्ट्रिंग के बराबर न हो, आपको ऐसा नहीं करना चाहिए ।
to_s Use का उपयोग करें इसके बजाय।
बीटीडब्ल्यू, यह केवल + . के लिए नहीं है विधि।
इसका उपयोग अन्य जगहों पर भी किया जाता है जहां केवल एक स्ट्रिंग जैसी वस्तु समझ में आती है।
पसंद करें :
[1,2,3].join(",")
अन्य लंबी रूपांतरण विधियां जैसे to_int &to_hash उसी तर्क का पालन करें।
इसलिए हमारे पास ये अलग-अलग तरीके हैं।
रूपांतरण रैपर का उपयोग कैसे करें
यदि आपके पास अभी तक पर्याप्त रूपांतरण विधियां नहीं हैं... चिंता न करें क्योंकि मेरे पास आपके लिए कुछ और हैं!
मैं इन्हें "रूपांतरण आवरण" कहना पसंद करता हूं।
वे हैं :
- सरणी ()
- पूर्णांक ()
- हैश[]
यह कुछ असामान्य रूप से दिखने वाले तरीके हैं!
कोष्ठक और वर्ग कोष्ठक पर ध्यान दें…
...इन विधियों को उनके वर्ग नामों से अलग करने वाली यही एकमात्र चीज है।
इनका उद्देश्य क्या है?
ऐरे () किसी भी चीज़ को ऐरे में बदल देगा।
यहां आपके लिए कुछ उदाहरण दिए गए हैं :
Array(nil)
# []
Array([])
# []
Array(1)
# [1]
Array("")
# [""]
यह कैसा तर्क है???
खैर, यह विधि नियमों के एक बहुत विशिष्ट सेट का अनुसरण करती है :
- अगर ऑब्जेक्ट
to_aryका जवाब देता है , याto_aयह उसे कॉल करेगा और मान लौटाएगा - अन्यथा, यह वस्तु को एक खाली सरणी के अंदर रखेगा और उसे वापस कर देगा
यह ऊपर दिखाए गए व्यवहार की व्याख्या करता है।
यह उपयोगी है यदि आप एक ऐसी विधि लिख रहे हैं जो एक सरणी की अपेक्षा करता है लेकिन यह कुछ और प्राप्त कर सकता है और आपकी विधि को पूरे एप्लिकेशन को क्रैश कर सकता है। आप इसे Array() . पर पास करके सुनिश्चित कर सकते हैं कि यह एक सरणी है इससे बचने के लिए सबसे पहले।
अब Integer() ।
इसके कुछ विशेष नियम हैं :
- यदि वस्तु एक स्ट्रिंग है और स्ट्रिंग की सामग्री रूबी में एक वैध संख्यात्मक प्रतिनिधित्व के अनुरूप है, तो यह विधि एक पूर्णांक लौटाएगी।
ArgumentErrorबढ़ाता है अगर अमान्य प्रारूप। - यदि ऑब्जेक्ट एक स्ट्रिंग नहीं है तो यह
to_int. को कॉल करने का प्रयास करेगा , फिरto_i। - यह एक
TypeErrorउत्पन्न करेगा यदि वस्तु को एक मान्यIntegerमें परिवर्तित नहीं किया जा सकता है रूपांतरण विधि का उपयोग करना।
उदाहरण :
Integer(1)
# 1
Integer("25")
# 25
Integer("abc123")
# ArgumentError (invalid value for Integer(): "abc123")
Integer([])
# TypeError (can't convert Array into Integer)
यह Integer() विधि उपयोगी है यदि आप 100% सुनिश्चित करना चाहते हैं कि आप एक मान्य Integer . के साथ काम कर रहे हैं ।
अब Hash[] ।
आप सम तत्वों . की एक सरणी पास कर सकते हैं नया हैश पाने के लिए:
Hash[[["a", 1], ["b", 2], ["c", 3]]]
# {"a"=>1, "b"=>2, "c"=>3}
उपयोगी है यदि आप दो सरणियों के तत्वों को मर्ज करके या मानचित्र जैसी विधि का उपयोग करके अपना हैश बना रहे हैं।
सारांश
आपने रूबी में विभिन्न रूपांतरण विधियों के बारे में सीखा है कि वे क्यों मौजूद हैं और उनका उपयोग कैसे करें!
मुझे आशा है कि आपको यह मददगार लगा होगा 🙂
अगर आपको यह लेख अच्छा लगा हो तो आपको मेरी किताब रूबी डीप डाइव भी पसंद आएगी, इसे देखें।