समानता का अर्थ है कि दो चीजें समान हैं। रूबी में, हम ऑब्जेक्ट्स और उनके मूल्यों की तुलना करके यह पता लगाते हैं कि वे एक ही ऑब्जेक्ट हैं या नहीं।
सवाल यह है...
रूबी में दो चीजों की तुलना कैसे करते हैं?
इस तरह:
1 == 1 # true
आप शायद इससे पहले से परिचित हैं...
लेकिन क्या आप जानते थे कि == एक मेथड है और सिर्फ सिंटैक्स नहीं?
निहितार्थ बड़े हैं।
आप इस मेथड को अपनी खुद की क्लासेस में लागू करके उन्हें अधिक शक्तिशाली बना सकते हैं। और यही आप इस पोस्ट में सीखेंगे!
क्या दो ऑब्जेक्ट्स को समान बनाता है?
आप दो स्ट्रिंग्स की तुलना इस तरह कर सकते हैं:
"foo" == "foo"
अगर शब्द और कैरेक्टर्स समान हैं, तो वे बराबर हैं।
अभिव्यक्ति true लौटाती है।
यह इसलिए काम करता है क्योंकि String क्लास एक == (दो इक्वल साइन) मेथड लागू करती है जो जानता है कि स्ट्रिंग्स की तुलना कैसे करें।
लेकिन क्या होगा अगर String ने == लागू नहीं किया?
तब रूबी Object के == के कार्यान्वयन का उपयोग करेगा, जो ऑब्जेक्ट सामग्री के बजाय ऑब्जेक्ट पहचान का परीक्षण करने के लिए डिफ़ॉल्ट है।
उदाहरण:
Object.new == Object.new # false String.new == String.new # true
Object के false लौटाने का कारण यह है कि दो नए ऑब्जेक्ट्स के अलग-अलग ऑब्जेक्ट आईडी हैं।
String के मामले में, चूंकि यह सामग्री के आधार पर तुलना करता है, और दो नई स्ट्रिंग्स की सामग्री समान होती है (वे खाली हैं) इसलिए यह true लौटाता है।
समानता लागू करना
अब जो आपने अभी सीखा है उसका उपयोग करके अपनी खुद की क्लासेस को अधिक शक्तिशाली बनाएं ताकि उनकी तुलना की जा सके।
== मेथड के लिए धन्यवाद...
आप ठीक से परिभाषित कर सकते हैं कि आपकी खुद की क्लास के दो इंस्टेंस के बराबर होने का क्या मतलब है।
उदाहरण:
class Product attr_reader :name, :price def initialize(name, price) @name, @price = name, price end def ==(other) self.name == other.name && self.price == other.price end end p1 = Product.new('book', 49) p2 = Product.new('book', 49) p1 == p2 # true == मेथड कहता है कि दो Product ऑब्जेक्ट्स को बराबर माना जाने के लिए नाम और कीमत दोनों समान होने चाहिए।
याद रखें:
यदि आप इस मेथड को लागू नहीं करते (या Comparable मॉड्यूल का उपयोग नहीं करते, जिसे मैं अपनी रूबी किताब में समझाता हूं) तो दो ऑब्जेक्ट्स की तुलना उनके ऑब्जेक्ट आईडी का उपयोग करके की जाएगी, उनके मूल्यों के बजाय।
मुझे यह भी उल्लेख करना चाहिए कि यदि आप स्ट्रक्ट का उपयोग करते हैं तो यह आपके लिए पहले से ही == लागू करता है।
ट्रिपल इक्वल्स के बारे में क्या?
आप सोच रहे होंगे कि अगर == एक मेथड है, तो क्या === भी एक मेथड है? और जवाब है हाँ 🙂
तो दोनों में क्या अंतर है?
जावास्क्रिप्ट में एक स्पष्ट अंतर है, जहां == ऑब्जेक्ट प्रकारों को समान बनाने का प्रयास करेगा यदि वे नहीं हैं (1 बनाम '1')। और === 'सख्त' समानता के लिए है।
लेकिन रूबी में ऐसी कोई चीज नहीं है। === का क्या अर्थ है यह उस क्लास पर निर्भर करता है जो इसे लागू करती है।
कई मामलों में यह सिर्फ == का एक उपनाम है।
String और Object की तरह।
यहां बिल्ट-इन क्लासेस की एक तालिका है जो === को विशेष अर्थ देती हैं:
| क्लास | अर्थ |
|---|---|
| Range | यदि obj रेंज का एक तत्व है तो सच लौटाता है, अन्यथा गलत। |
| Regexp | स्ट्रिंग के खिलाफ रेगेक्स मिलान करता है। |
| Module | यदि obj mod का एक इंस्टेंस है या mod के वंशजों में से एक का इंस्टेंस है तो सच लौटाता है। |
| Proc | ब्लॉक को obj के साथ पैरामीटर के रूप में इनवोक करता है जैसे Proc#call। यह एक proc ऑब्जेक्ट को केस स्टेटमेंट में when क्लॉज का लक्ष्य बनाने की अनुमति देता है। |
निष्कर्ष
इस पोस्ट में आपने सीखा कि == मेथड को लागू करके अपनी क्लासेस को अधिक शक्तिशाली कैसे बनाया जाए। आपने == और === के बीच अंतर भी सीखा।
इस पोस्ट को शेयर करना न भूलें ताकि अधिक लोग इसे देख सकें 🙂