रूबी: kind_of? बनाम inst_of? बनाम is_a


487

अंतर क्या है? मुझे कब उपयोग करना चाहिए? उनमें से कई क्यों हैं?


18
क्यों दोनों के लिए is_a?और kind_of?मौजूद: मुझे लगता है कि यह रूबी के डिजाइन दर्शन का हिस्सा है। पायथन कहेगा कि कुछ करने का केवल एक तरीका होना चाहिए; रूबी में अक्सर पर्यायवाची विधियाँ होती हैं, ताकि आप उस का उपयोग कर सकें जो बेहतर लगता है। यह वरीयता की बात है। यह आंशिक रूप से जापानी प्रभाव के कारण हो सकता है: मुझे बताया गया है कि वे ध्वनि को अच्छा बनाने के लिए वाक्य के आधार पर एक ही संख्या के लिए एक अलग शब्द का उपयोग करेंगे। हो सकता है कि मैट्स ने उस विचार को अपनी भाषा के डिजाइन में शामिल किया हो।
नाथन लॉन्ग

@NathanLong मुझे नहीं लगता कि जापानी काउंटरों का इससे बहुत लेना-देना है; सभी भाषाओं में किसी प्रकार का समझौता होता है और आप एक काउंटर को दूसरे समय के लिए प्रतिस्थापित नहीं कर सकते हैं (जैसे, आप फ्लैट वस्तुओं के लिए सिलेंडर काउंटर का उपयोग नहीं कर सकते; यह सिर्फ गलत है)। और यह व्यंजना की तुलना में शब्दार्थ के साथ अधिक है।
केसी

जवाबों:


621

kind_of?और is_a?पर्यायवाची हैं।

instance_of?अन्य दो से अलग है कि यह केवल तभी लौटता है trueजब ऑब्जेक्ट उस सटीक वर्ग का एक उदाहरण है, न कि एक उपवर्ग।

उदाहरण:

  • "hello".is_a? Objectऔर "hello".kind_of? Objectवापसी trueक्योंकि "hello"एक है Stringऔर Stringएक उपवर्ग है Object
  • हालांकि "hello".instance_of? Objectरिटर्न false

77
यह सिर्फ कभी-कभी बेहतर पढ़ता है। सोचो @honda.kind_of? Carऔर @person.is_a? Administrator, रूबी सौंदर्यशास्त्र के बारे में सब कुछ। वास्तव में, नोटिस व्याकरण त्रुटि ... सक्रिय समर्थन आप लिख सकते हैं साथ @person.is_an? Administrator:) ... यही कारण है कि यह रूबी कोर में अब तक बना दिया है हो सकता है, वास्तव में।
rfunduk

2
हे एक दिलचस्प कारण है। क्या तुम इसे तोड़ सकते हो? जैसे आप ओवरराइड कर सकते हैं kind_of?लेकिन नहीं is_a??
क्लाउडीयू

3
@thenduks, is_an?रूबी- 1.9.2- p0 में नहीं है। @ कलुआडु, नहीं। is_a?का सिर्फ एक उपनाम हैkind_of? । एक ही सी समारोह को लागू दोनों ही तरीकों से, rb_obj_is_kind_of
ma11hew28

9
@ मैट: आप अलियास फ़ंक्शन को ओवरराइड किए बिना एक उपनाम को ओवरराइड कर सकते हैं। तो हाँ, आप ओवरराइड kind_of?किए बिना ओवरराइड कर सकते हैं is_a?
sepp2k

4
जहां इस ActiceSupport है is_an?विधि ?! यह वर्तमान रेल संस्करण में नहीं है, और मैं इसके बारे में Google पर कुछ भी नहीं पा रहा हूँ या तो इसे पदावनत किया जा रहा है।
टॉम लॉर्ड

22

अंतर क्या है?

प्रलेखन से:

- ( बुलियन )instance_of?(class)
दिए गए वर्ग का एक उदाहरण है, trueतो लौटाता objहै।

तथा:

- ( बुलियन ) is_a?(class)
- ( बुलियन )kind_of?(class)
रिटर्न trueअगर classकी श्रेणी है obj, या अगर classमें objशामिल मॉड्यूल या सुपरक्लेसेस में से एक है obj

यदि यह अस्पष्ट है, तो यह जानना अच्छा होगा कि वास्तव में क्या अस्पष्ट है, ताकि प्रलेखन में सुधार किया जा सके।

मुझे कब उपयोग करना चाहिए?

कभी नहीँ। इसके बजाय बहुरूपता का उपयोग करें।

उनमें से कई क्यों हैं?

मैं दो "कई" नहीं कहूंगा । उनमें से दो हैं, क्योंकि वे दो अलग-अलग काम करते हैं।


3
मुझे लगता है कि मेरा भ्रम यह था कि 3 हैं, और यह 2 बस एक ही काम करते हैं और अलग-अलग नाम हैं। बहुरूपता का उपयोग कर के बारे में - मैं मानता हूँ, लेकिन गहरे लाल रंग का मानक पुस्तकालय इनमें से प्रत्येक का उपयोग करता है से भरा है
Claudiu

4
बहुरूपता से आपका क्या तात्पर्य है? क्या यह बतख टाइपिंग के समान है?
एंड्रयू ग्रिम

2
हां, वे वही हैं। बत्तख टाइपिंग बहुरूपता का एक रूप है।
स्पेसगॉस्ट

3
बहुरूपता करने के लिए अक्सर बेहतर होता है, हां, लेकिन सीमा के मामले हैं जहां आप वास्तव में जानना चाहते हैं कि आपके पास एक विशिष्ट वर्ग है, जैसे कि जब आप फ़ाइलों के साथ काम कर रहे हैं।
Automatico

6

यह वस्तुओं का उपयोग करने के लिए अधिक रूबी की तरह है, चाहे वे किसी ऐसी विधि का जवाब दें जिसका आपको उपयोग करने की आवश्यकता है या नहीं respond_to?। यह न्यूनतम इंटरफ़ेस और कार्यान्वयन दोनों अनजान प्रोग्रामिंग की अनुमति देता है।

यह हमेशा पाठ्यक्रम के लिए लागू नहीं होता है, इस प्रकार "टाइप" के बारे में अधिक रूढ़िवादी समझ के बारे में पूछने की संभावना अभी भी है, जो कि आपके द्वारा पूछे जाने वाले तरीकों का उपयोग करके वर्ग या आधार वर्ग है।


5
यह स्थिति पर निर्भर करता है। टिप्पणी और ब्लॉग दोनों ही create_at का जवाब दे सकते हैं। ऐसी स्थिति में is_a? अधिक उपयुक्त IMHO है
पेनकोवस्की

इससे कोई मतलब नहीं है, अगर आपको एक टिप्पणी और एक ब्लॉग ऑब्जेक्ट को एक दूसरे से अलग करने की आवश्यकता है, तो आप इसे करने के लिए create_at का उपयोग नहीं करेंगे। इसका यह मतलब नहीं है कि आप एक ऐसा तरीका लिख ​​सकते हैं जो एक ऐसी वस्तु लेता है जो create_at के प्रति प्रतिक्रिया करता है। यदि उसे अपना काम करने के लिए किसी और चीज की आवश्यकता नहीं है, तो आप सुरक्षित रूप से टिप्पणी या ब्लॉग पर या किसी अन्य ActiveRecord मॉडल का उपयोग कर सकते हैं।
किंग्डन

3

मैं भी दो कई फोन नहीं करूँगा ( is_a?और kind_of?एक ही विधि के उपनाम), लेकिन अगर आप अधिक संभावनाएँ देखना चाहते हैं, तो अपना ध्यान इस #classतरीके पर लगाएँ:

A = Class.new
B = Class.new A

a, b = A.new, B.new
b.class < A # true - means that b.class is a subclass of A
a.class < B # false - means that a.class is not a subclass of A
# Another possibility: Use #ancestors
b.class.ancestors.include? A # true - means that b.class has A among its ancestors
a.class.ancestors.include? B # false - means that B is not an ancestor of a.class

1
धन्यवाद - मैं वास्तव में "रन-टाइम प्रकार की जानकारी रूबी और कैसे" में इकट्ठा की जा सकती है, के सामान्य अर्थों में पूछ रहा था - और यह पर्याप्त उदाहरण प्रदान करता है
क्लाउडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.