2015-05-15 10 views
9

मैं रूबी के case सिंटैक्स का उपयोग कर रहा हूँ के रूप में इस के लिए कुछ सरल self.class के आधार पर तर्क स्थापित करने के लिए:self.class === MyClass क्यों झूठी वापसी करता है, जबकि self.class == MyClass सत्य देता है?

case self.class 
when FirstClass 
    do stuff.... 
when SecondClass 
    do other stuff... 
end 

मैं जल्द ही महसूस किया कि यह हमेशा करीब जांच करने पर nil. देता है, मैंने पाया case का उपयोग करता है === बजाय == जाँच करने के लिए समानता। मेरे टर्मिनल में self.class == FirstClass चलाते समय मुझे true मिलता है, हालांकि self.class === FirstClassfalse देता है।

माणिक दस्तावेज़ों में देख रहे हैं, मैंने पाया === की following explanation:

प्रकरण समानता - वर्ग वस्तु के लिए, प्रभावी रूप से बुला # ==, लेकिन आम तौर पर वंश द्वारा ओवरराइड के रूप में ही उपलब्ध कराने के लिए सार्थक अर्थ विज्ञान बयान के मामले में।

क्या कोई भी हो सकता है कि क्या हो रहा है पर कुछ प्रकाश डाला जा सकता है? अग्रिम में धन्यवाद।

+0

यह मुझे प्रबुद्ध नहीं था, लेकिन कक्षा मॉड्यूल से निकलती है, जिसका === इम्प्ल्यू यहां है: http://ruby-doc.org/core-2.2.0/Module.html#3D -3 डी-3 डी-विधि –

+0

http://stackoverflow.com/questions/4467538/what-does-the-operator-do-in-ruby – Dreamweaver

+0

http://truffles.me.uk/rubys-equality-operator – oobivat

उत्तर

5

सुराग, में "आम तौर पर वंश द्वारा ओवरराइड मामले बयान में सार्थक अर्थ विज्ञान प्रदान करने के लिए" है विशेष Module overrides it में:

प्रकरण समानता - रिटर्न true अगर objआधुनिक या एक का एक उदाहरण है mod के वंशज। मॉड्यूल के लिए सीमित उपयोग के, लेकिन कक्षा द्वारा वस्तुओं को वर्गीकृत करने के लिए case कथन में उपयोग किया जा सकता है।

तो मॉड्यूल === में कार्य करता है बहुत ज्यादा is_a? विधि की तरह के लिए (वास्तव में यह सिर्फ एमआरआई रूबी, rb_obj_is_kind_of में एक ही लागू करने फ़ंक्शन को कॉल)। आपके उदाहरण में यह false का मूल्यांकन करता है क्योंकि self.classFirstClass का उदाहरण नहीं है। यह सिर्फ Class का उदाहरण होने की संभावना है। self अकेले लेकिन एक उदाहरण हो सकता है:

case self 
when FirstClass 
    do stuff.... 
when SecondClass 
    do other stuff... 
end 

(हालांकि मुझे लगता है कि अपने डिजाइन बहुत सही नहीं हो सकता है, एक वस्तु के वर्ग परीक्षण आम तौर पर एक कोड गंध है इसके बजाय आप शायद में एक विधि के विभिन्न कार्यान्वयन होना चाहिए। ऑब्जेक्ट्स।)

+0

अच्छा, एक आकर्षण की तरह काम करता है (अच्छी व्याख्या भी)। पुन। कोड गंध: मैं निश्चित रूप से सहमत हूं, यह एक भयानक उपयोग केस है - 'केस' चेक क्लास और उसके बाद विधि की उचित भिन्नता को कॉल करता है। आम तौर पर मैं सिर्फ अपने संबंधित वर्गों में विधियों को फेंक दूंगा, लेकिन इस मामले में मैं एक ही स्थान पर एक विशिष्ट सुविधा से संबंधित सभी तर्क प्राप्त करने की कोशिश कर रहा हूं। – Zensaburou

+0

अच्छा जवाब। एक और उदाहरण है [Regexp # ===] (http://ruby-doc.org/core-2.1.4/Regexp.html#method-i-3D-3D-3D)। उदाहरण के लिए, '/ a/===' cat '# => true', लेकिन यह वास्तव में केवल' केस 'कथन में उपयोग किया जाता है:' केस 'बिल्ली'; जब/ए/... '। –

संबंधित मुद्दे