टाइप कोएर्सन एक ऑब्जेक्ट के प्रकार को उसके मान के साथ दूसरे प्रकार में बदलना है। उदाहरण के लिए, #to_s के साथ एक Integer को String में बदलना या #to_i के साथ एक Float को Integer में बदलना। शायद कम ज्ञात #to_str और #to_int मेथड्स जो कुछ ऑब्जेक्ट्स इम्प्लीमेंट करते हैं, पहली नज़र में वही करते हैं, लेकिन कुछ अंतर हैं।
AppSignal अकादमी के इस संस्करण में, हम रूबी में एक्सप्लिसिट कास्टिंग और इम्प्लिसिट कोएर्सन में गोता लगाएंगे, जबकि अभिनेता टाइपकास्टिंग को संक्षेप में छूएंगे। हम दोनों मेथड्स के बीच अंतर को कवर करेंगे, और चर्चा करेंगे कि उनका उपयोग कैसे किया जाता है।
आइए पहले देखें कि हम रूबी में एक्सप्लिसिट कास्टिंग हेल्पर्स के साथ आमतौर पर वैल्यूज को विभिन्न प्रकारों में कैसे कोएर्स करते हैं।
एक्सप्लिसिट कास्टिंग हेल्पर्स
सबसे आम कास्टिंग हेल्पर्स #to_s, #to_i, #to_a और #to_h हैं। ये एक्सप्लिसिट कास्टिंग मेथड्स हैं। वे हमें एक वैल्यू को एक प्रकार से दूसरे प्रकार में आसानी से बदलने में मदद करते हैं।
एक्सप्लिसिट हेल्पर्स एक स्पष्ट वादे के साथ आते हैं। जब भी किसी ऑब्जेक्ट पर #to_s कॉल किया जाता है, तो यह हमेशा एक स्ट्रिंग लौटाएगा, भले ही ऑब्जेक्ट वास्तव में स्ट्रिंग में अच्छी तरह से परिवर्तित न हो। यह माइकल कीटन को बैटमैन के रूप में कास्ट करने जैसा है। आपको एक बैटमैन मिलेगा, भले ही एक कॉमेडी अभिनेता भूमिका के लिए विशेष रूप से उपयुक्त न हो।
रूबी रूबी स्टैंडर्ड लाइब्रेरी में लगभग किसी भी बेसिक ऑब्जेक्ट पर ये हेल्पर मेथड्स प्रदान करता है।
ये मेथड्स, विशेष रूप से #to_s, रूबी में अधिकांश बेसिक प्रकारों पर इम्प्लीमेंटेड हैं। जबकि कास्टिंग लगभग हमेशा एक वैल्यू लौटाती है, परिणाम वह नहीं हो सकता जिसकी हम अपेक्षा करते हैं।
#to_s, #to_i, #to_a और #to_h हेल्पर्स को कॉल करने से किसी भी वैल्यू को चयनित प्रकार में बाध्य किया जाता है। वे उस प्रकार का प्रतिनिधित्व लौटाते हैं जिसमें इसे कोएर्स किया गया है, चाहे वैल्यू के साथ कुछ भी हो।
इम्प्लिसिट कोएर्सन मेथड्स
उन वैल्यूज पर टाइप कास्टिंग मेथड्स को कॉल करना जो उस प्रकार की तरह व्यवहार नहीं करते जिसे हम कास्ट कर रहे हैं, एरर्स या डेटा हानि का कारण बन सकता है। रूबी इम्प्लिसिट कोएर्सन मेथड्स भी प्रदान करता है जो केवल तभी वैल्यू लौटाते हैं जब ऑब्जेक्ट्स उस प्रकार की तरह व्यवहार करते हैं। इस तरह हम सुनिश्चित हो सकते हैं कि वैल्यू उस प्रकार की तरह व्यवहार करती है जो हम चाहते हैं। ये इम्प्लिसिट कोएर्सन मेथड्स #to_str, #to_int, #to_ary और #to_hash हैं।
इम्प्लिसिट कोएर्सन लियोनार्ड निमॉय को स्पॉक के अलावा किसी भी भूमिका में कास्ट करने जैसा है। वे काम करेंगे यदि चरित्र स्पॉक के काफी करीब है, लेकिन विफल होंगे यदि वे नहीं हैं। #to_str हेल्पर कोशिश करता है एक स्ट्रिंग में बदलने की, लेकिन यदि ऑब्जेक्ट मेथड इम्प्लीमेंट नहीं करता और इम्प्लिसिटली कोएर्स नहीं किया जा सकता तो NoMethodError उठाएगा।
हम देख सकते हैं कि रूबी अब थोड़ा अधिक सख्त है कि वह क्या करता है और क्या अनुरोधित प्रकारों में कोएर्स नहीं करता। यदि कोएर्सन संभव नहीं है, तो #to_* मेथड ऑब्जेक्ट पर इम्प्लीमेंटेड नहीं है और इसे कॉल करने पर NoMethodError उठता है।
इम्प्लिसिट कोएर्सन का उपयोग करते समय, जैसे #to_str, हम फ़ंक्शन से एक स्ट्रिंग ऑब्जेक्ट लौटाने के लिए कहते हैं, केवल यदि मूल प्रकार भी एक स्ट्रिंग की तरह व्यवहार करता है। इस कारण से, #to_str रूबी स्टैंडर्ड लाइब्रेरी में केवल String पर इम्प्लीमेंटेड है।
रूबी इम्प्लिसिट कोएर्सन का उपयोग कैसे करता है
कोएर्सन के दौरान हम जो मांग रहे हैं उसमें अधिक सटीक होने के अलावा, इम्प्लिसिट कोएर्सन और किस लिए उपयोगी है? पता चला है रूबी खुद इसका काफी परिदृश्यों में उपयोग करता है। उदाहरण के लिए, + के साथ ऑब्जेक्ट्स को संयोजित करते समय।
यहां, हम देखते हैं कि रूबी एक TypeError उठाता है क्योंकि यह Name प्रकार से String में इम्प्लिसिट कन्वर्जन नहीं कर सकता।
यदि हम क्लास पर #to_str इम्प्लीमेंट करते हैं, तो रूबी जानता है कि Name प्रकार को कैसे कोएर्स करना है।
यही Arrays और #to_ary के लिए काम करता है।
लेकिन #to_ary अधिक परिदृश्यों में उपयोग किया जाता है। हम इसका उपयोग एक Array को अलग-अलग वेरिएबल्स में डिस्ट्रक्चर करने के लिए कर सकते हैं।
यह ऑब्जेक्ट को ब्लॉक पैरामीटर्स में कन्वर्जन भी करता है।
ऐसे और परिदृश्य हैं जहां इम्प्लिसिट कोएर्सन मेथड्स उपयोग किए जाते हैं, जैसे ** के साथ #to_hash। यह parse_options मेथड में पास करने से पहले #to_hash के साथ वैल्यू को हैश में कोएर्स करता है।
प्रकार लागू करना
रूबी अधिक लचीले कोएर्सन मेथड्स भी प्रदान करता है जब प्रकार अज्ञात प्रकार का होता है और हम यह सुनिश्चित करना चाहते हैं कि हमें सही प्रकार मिले। हर बेसिक प्रकार के लिए एक है (String(...), Integer(...), Float(...), Array(...), Hash(...), आदि)।
String(...) मेथड पहले वैल्यू पर #to_str कॉल करने की कोशिश करता है, और जब वह विफल होता है, तो इसके #to_s मेथड को कॉल करता है। सभी ऑब्जेक्ट्स #to_str मेथड परिभाषित नहीं करते, इसलिए इम्प्लिसिट कोएर्सन (#to_str) और एक्सप्लिसिट (#to_s) कास्टिंग मेथड्स दोनों के साथ जांच करने से स्ट्रिंग कन्वर्जन के काम करने की संभावना बढ़ जाती है और आप वह वैल्यू प्राप्त करेंगे जो आप चाहते हैं। पहले इम्प्लिसिट कोएर्सन के लिए कॉल करके हमें एक परिणाम मिलने की अधिक संभावना है जिसमें समान वैल्यू हो लेकिन कोएर्स्ड प्रकार का हो, और "#<Object:0x00007f8e6d053a90>" जैसा कुछ नहीं।
आपको केवल उन ऑब्जेक्ट्स के लिए इम्प्लिसिट कास्टिंग मेथड्स इम्प्लीमेंट करना चाहिए जो कोएर्स किए जाने वाले प्रकार की तरह व्यवहार करते हैं, जैसे आपके अपने String क्लास के लिए #to_str।
पहले इम्प्लिसिट कोएर्सन की कोशिश करने के अलावा, String(...) हेल्पर लौटाए गए प्रकार की भी जांच करता है। #to_str सिर्फ एक मेथड है जो किसी भी प्रकार का मान लौटा सकता है, यहां तक कि नॉन-स्ट्रिंग्स भी। यह सुनिश्चित करने के लिए कि हमें अनुरोधित प्रकार का मान मिले, String(...) TypeError उठाता है यदि प्रकार मेल नहीं खाते।
यहां, हम देख सकते हैं कि रूबी #to_str के परिणाम को नजरअंदाज करता है क्योंकि इसने nil लौटाया, जो String-प्रकार का नहीं है। इसके बजाय, यह #to_s परिणाम पर वापस आ जाता है।
यदि #to_s भी nil लौटाता है और इस प्रकार सही प्रकार का नहीं है, तो String(...) TypeError उठाएगा।
हालांकि वे टाइप कोएर्सन लागू करने में अधिक विश्वसनीय हो सकते हैं, ध्यान दें कि कास्टिंग हेल्पर मेथड्स (String(...), Integer(...), आदि) आमतौर पर थोड़े धीमे होते हैं क्योंकि उन्हें दिए गए मान पर अधिक जांच करने की आवश्यकता होती है।
निष्कर्ष
जब आप यह सुनिश्चित करना चाहते हैं कि आप किसी ऑब्जेक्ट के लिए सही प्रकार के डेटा से निपट रहे हैं, तो टाइप कोएर्सन एक उपयोगी प्रक्रिया है। इस पोस्ट में, हमने #to_s, #to_i, #to_a और #to_h जैसे एक्सप्लिसिट कास्टिंग हेल्पर्स के अपने ज्ञान को ताज़ा किया। हमने उन उदाहरणों को भी देखा जब #to_str, #to_int, #to_ary और #to_hash जैसे इम्प्लिसिट हेल्पर्स उपयोगी होते हैं और रूबी द्वारा उनका उपयोग कैसे किया जाता है।
हमें उम्मीद है कि आपको यह टाइप कोएर्सन अवलोकन उपयोगी लगा और आपने अभिनेता टाइपकास्टिंग सादृश्य को कैसे पाया। हमेशा की तरह, हमें बताएं कि क्या कोई ऐसा विषय है जिसे आप हमें कवर करना चाहेंगे। यदि आपके कोई प्रश्न या टिप्पणियां हैं, तो @AppSignal पर हमें एक लाइन ड्रॉप करने में संकोच न करें।