Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

रूबी समानता में महारत: कस्टम `==` कार्यान्वयन के साथ ऑब्जेक्ट्स की तुलना

समानता का अर्थ है कि दो चीजें समान हैं। रूबी में, हम ऑब्जेक्ट्स और उनके मूल्यों की तुलना करके यह पता लगाते हैं कि वे एक ही ऑब्जेक्ट हैं या नहीं।

सवाल यह है...

रूबी में दो चीजों की तुलना कैसे करते हैं?

इस तरह:

 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 क्लॉज का लक्ष्य बनाने की अनुमति देता है।

निष्कर्ष

इस पोस्ट में आपने सीखा कि == मेथड को लागू करके अपनी क्लासेस को अधिक शक्तिशाली कैसे बनाया जाए। आपने == और === के बीच अंतर भी सीखा।

इस पोस्ट को शेयर करना न भूलें ताकि अधिक लोग इसे देख सकें 🙂

  1. दो जावास्क्रिप्ट ऑब्जेक्ट्स को कैसे मर्ज करें? दो जावास्क्रिप्ट ऑब्जेक्ट्स को कैसे मर्ज करें?

    दो जावास्क्रिप्ट ऑब्जेक्ट्स को एक साथ मर्ज करने का कोड निम्नलिखित है - उदाहरण <!DOCTYPE html> <html lang=en> <head> <meta charset=UTF-8 /> <meta name=viewport content=width=device-width, initial-scale=1.0 /> <title>Document</title> <style>   &nb

  1. iPhone/iOS में दो NSDate की तुलना कैसे करें? iPhone/iOS में दो NSDate की तुलना कैसे करें?

    Swift में दो डेट्स की तुलना इस लेख में हम देखेंगे कि Swift में दो NSDate की तुलना कैसे करें। सबसे पहले हमें दो NSDate बनाने होंगे। हम इसे सिम्युलेटर के बजाय प्लेग्राउंड में करेंगे। पहले दो अलग-अलग डेट्स बनाएं: let dateOne = DateComponents() dateOne.day = 5 dateOne.month = 6 dateOne.year = 1993 le

  1. रूबी के फ्रीज मेथड को समझना: ऑब्जेक्ट म्यूटेबिलिटी समझाया गया रूबी के फ्रीज मेथड को समझना: ऑब्जेक्ट म्यूटेबिलिटी समझाया गया

    किसी ऑब्जेक्ट के म्यूटेबल होने का क्या अर्थ है? फैंसी शब्दों को आपको भ्रमित न करने दें, म्यूटेबिलिटी का सीधा सा अर्थ है कि किसी ऑब्जेक्ट की आंतरिक स्थिति को बदला जा सकता है। यह उन ऑब्जेक्ट्स को छोड़कर सभी ऑब्जेक्ट्स का डिफ़ॉल्ट है जिन्हें फ्रीज किया गया है, या जो विशेष ऑब्जेक्ट्स की सूची का हिस्सा ह