माणिक्य में किसी वस्तु का प्रकार निर्धारित करना


364

मैं अजगर का उपयोग करूँगा कि मैं क्या देख रहा हूँ (यदि आप अजगर नहीं जानते हैं तो आप इसे स्यूडोकोड के रूप में सोच सकते हैं):

>>> a = 1
>>> type(a)
<type 'int'>

मुझे पता है कि मैं रूबी में कर सकता हूं:

1.9.3p194 :002 > 1.class
 => Fixnum 

लेकिन क्या वस्तु के प्रकार को निर्धारित करने का यह उचित तरीका है?


5
@ JörgWMittag फिर भी AFAICR जो कि `टाइप` पाइथन में करता है, हालाँकि मेरी याददाश्त फीकी है। आपको isinstance जवाब देने की आवश्यकता होगी या जांच करनी होगी । लेकिन बस "NOES !!!" वास्तव में उपयोगी नहीं है, अब, यह है? इसके बजाय शैक्षिक होने पर विचार करें।
डेव न्यूटन

4
@ JörgWMittag जब मैं सहानुभूतिपूर्ण हूं, ओपी ने रूबी में नकल करने के लिए कोड प्रदान किया। जब तक आप वास्तव में ओपी को शिक्षित करने के लिए कह रहे हैं कि शोर सहायक नहीं है, आईएमओ। और यहां तक ​​कि अगर आपने किया, तो यह केवल सूचनात्मक होगा, क्योंकि ओपी परिभाषित करता है कि वह कोड चाहता है।
डेव न्यूटन

5
@ JörgWMittag - रूबी में सब कुछ एक वस्तु है, इसलिए वहाँ कोई आदिम प्रकार नहीं हैं क्योंकि पाइथन (इंट, लॉन्ग, बूलियन आदि) में हैं। रूबी के भीतर, कक्षाएं टाइप परिभाषाएँ हैं। यह रूबी तक ही सीमित नहीं है, शब्द वर्ग और प्रकार कई अन्य भाषाओं में पर्यायवाची हैं, और मोटे तौर पर ओओपी सिद्धांत में।
ओदोडो

6
चूंकि हम वास्तव में रूबी के बारे में यहां बात कर रहे हैं, प्रकार और वर्ग पर्यायवाची हैं, इस बारे में कोई बहस नहीं है, सभी मान ऑब्जेक्ट हैं। तो किसी के लिए बस रूबी के बारे में बात कर रहे हैं , कक्षाएं प्रकार हैं। - रेफ: रूबी- lang.org/en/about
४:५४ पर ओकोडो

2
@ JörgWMittag यह निबंध अब तक काफी जानकारीपूर्ण है, और मौका मिलने पर मैं इसे पढ़ता हूँ। विशेष रूप से, कुक काफी अच्छी तरह से स्पष्ट करने के लिए लगता है (और की तुलना में मैं और अधिक पृष्ठभूमि ज्ञान के साथ) क्यों यह दावा (मेरी प्रोफेसरों में से एक किया था) कि अजगर, रूबी, और अन्य गतिशील टाइप भाषाओं "नहीं कर रहे हैं करने के लिए गलत है वास्तव में वस्तु -अनुशासित "(वह, जो शायद इसका मतलब था, यह एहसास किए बिना, कि वे एडीटी-उन्मुख नहीं थे)। लेकिन रूबी को वैधानिक रूप से टाइप नहीं किया गया है, इसलिए यह उस अर्थ में ADTs नहीं है जिसे कुक वर्णन कर रहा है, इसलिए उस अंतर के आधार पर आपकी आपत्तियां मददगार नहीं हैं।
काइल स्ट्रैंड

जवाबों:


607

किसी वस्तु के "प्रकार" को निर्धारित करने का उचित तरीका, जो कि रूबी दुनिया में एक अस्पष्ट शब्द है, को कॉल करना है object.class

चूंकि कक्षाएं अन्य वर्गों से विरासत में मिल सकती हैं, यदि आप यह निर्धारित करना चाहते हैं कि क्या कोई वस्तु "एक विशेष प्रकार की है" तो आप यह object.is_a?(ClassName)देखने के लिए कॉल कर सकते हैं कि objectक्या वह टाइप का है ClassNameया उससे प्राप्त किया गया है।

आमतौर पर टाइपिंग की जाँच रूबी में नहीं की जाती है, बल्कि इसके बजाय विशेष तरीकों पर प्रतिक्रिया करने की उनकी क्षमता के आधार पर वस्तुओं का आकलन किया जाता है, जिसे आमतौर पर " डक " कहा जाता है । दूसरे शब्दों में, यदि यह आपके इच्छित तरीकों पर प्रतिक्रिया करता है, तो विशेष रूप से इस प्रकार के होने का कोई कारण नहीं है।

उदाहरण के लिए, object.is_a?(String)बहुत कठोर है क्योंकि एक अन्य वर्ग ऐसे तरीकों को लागू कर सकता है जो इसे एक स्ट्रिंग में परिवर्तित करते हैं, या इसे व्यवहारिक रूप से व्यवहार करते हैं कि स्टैट्स कैसे व्यवहार करता है। object.respond_to?(:to_s)यह परीक्षण करने का एक बेहतर तरीका होगा कि प्रश्न में वस्तु वही करे जो आप चाहते हैं।


13
-1। ऑब्जेक्ट के प्रकार को वापस नहीं#class करता है , यह अपनी कक्षा को लौटाता है । नाम एक मृत सस्ता होना चाहिए। OO में क्लास और टाइप दो पूरी तरह से अलग अवधारणाएँ हैं।
जोर्ग डब्ल्यू मित्तग

78
@ जोर्ग डब्ल्यू मित्तग: मैं असहमत हूं। "क्लास" और "प्रोसेसर स्पीड" (एक उदाहरण लेने के लिए) दो पूरी तरह से अलग अवधारणाएं हैं, लेकिन "क्लास" और "टाइप" बारीकी से संबंधित अवधारणाएं हैं। उदाहरण के लिए, यहां क्लास पर विकिपीडिया का लेख कहता है: "ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, एक क्लास एक निर्माण है जिसका उपयोग एक अलग प्रकार को परिभाषित करने के लिए किया जाता है।" प्रश्नकर्ता के लिए tadman मददगार साबित हो रहा था।
तैमू लीस्टी

18
@ JörgWMittag रूबी में typeofसी, जावास्क्रिप्ट और अन्य से निकटतम चीज़ है class। रूबी में कोई औपचारिक प्रोटोकॉल प्रणाली नहीं है जैसे कि अन्य भाषाओं में है, उद्देश्य-सी उस के साथ निकटतम स्मॉलटॉक के सापेक्ष है। यदि आप "प्रकार" को "ऑब्जेक्ट" के रूप में परिभाषित कर रहे हैं, जो स्वीकार्य परिणामों के साथ विधियों के एक विशेष सेट पर प्रतिक्रिया करता है "तो वास्तव में उस पर जोर देने का कोई तरीका नहीं है। यह बहुत ढीला है। रूबी में ज्यादातर जब किसी वस्तु के प्रकार का जिक्र होता है, तो समझा जाता है कि आप कक्षा के बारे में बात कर रहे हैं। मैंने उस कारण के लिए उद्धरण चिह्नों में शब्द प्रकार का उपयोग किया।
तदमन

14
@ जोर्ग डब्ल्यू मित्तग: मैं यह कहना जारी रखता हूं कि "वर्ग" और "प्रकार" निश्चित रूप से ओओ में पूरी तरह से अलग अवधारणाएं नहीं हैं, जैसा कि उद्धरण द्वारा प्रदर्शित किया गया है। (इसके अलावा: आप जावा में एक चर कैसे घोषित देकर? या तो प्रकार या वर्ग चर का, अपने नाम के बाद: " int i" या " Integer j"।) Tadman एक तरह से सवाल है कि दोनों प्रश्नकर्ता को संतुष्ट लग रहा था जवाब और सामान्य दर्शक, रूबी शब्दावली का उपयोग करते हुए स्पष्ट करते हैं। मुझे ऑब्जेक्ट-ओरिएंटेड शब्दावली के महीन बिंदुओं पर अकादमिक हेयर-स्प्लिटिंग में कोई दिलचस्पी नहीं है, इसलिए कृपया अंतिम शब्द रखें।
तेमू लीस्टी

11
@TeemuLeisti यहां सबसे अधिक परेशानी इस तथ्य से आती है कि रूबी में सब कुछ एक वस्तु है, और इसलिए एक वर्ग है, जबकि वास्तव में हर दूसरी भाषा में आदिम प्रकार हैं जो ऑब्जेक्ट नहीं हैं और वस्तुओं के विपरीत कोई वर्ग नहीं है, जो करते हैं। जब शुद्ध प्रकार की कोई चीज नहीं होती है, और किसी को औपचारिक रूप से परिभाषित करने का कोई तरीका नहीं होता है, तो रूबी दुनिया में अर्थ विशेष रूप से धुंधला हो जाता है। मात्ज़ अपने स्वयं के अलावा यहां किसी विशेष विचारधारा का कड़ाई से पालन नहीं कर रहे हैं।
tadman


44

रूबी में अक्सर, आप वास्तव में परवाह नहीं करते हैं कि ऑब्जेक्ट की कक्षा क्या है, प्रति से, आप बस परवाह करते हैं कि यह एक निश्चित विधि का जवाब देता है। इसे डक टाइपिंग के रूप में जाना जाता है और आप इसे हर तरह के रूबी कोडबेस में देखेंगे।

तो कई में (यदि सबसे अधिक नहीं) मामलों में, इसका उपयोग करने के लिए डक टाइपिंग का उपयोग करना सबसे अच्छा है #respond_to?(method):

object.respond_to?(:to_i)

1
वैध बिंदु। इस सवाल का जवाब नहीं है, लेकिन सवाल की भावना को मारा।
user566245

@ user566245 यह अच्छी तरह से प्रतिक्रिया करता है। बहुत यकीन है कि जवाब सवाल का जवाब देने की जरूरत है।
आर। रिनकॉन

17

मैं हाँ कहूँगा"। जैसा कि "मैत्ज़" ने अपनी एक वार्ता में कुछ इस तरह कहा था, "रूबी वस्तुओं का कोई प्रकार नहीं है।" यह सब नहीं है, लेकिन वह हिस्सा जो वह हमें पाने की कोशिश कर रहा है। फिर किसी ने "सब कुछ एक वस्तु है" क्यों कहा होगा? उसे जोड़ने के लिए उन्होंने कहा "डेटा में ऑब्जेक्ट नहीं हैं"।

तो हम इसका आनंद ले सकते हैं।

https://www.youtube.com/watch?v=1l3U1X3z0CE

लेकिन रूबी सिर्फ क्लास के ऑब्जेक्ट के प्रकार के बारे में ज्यादा परवाह नहीं करती है। हम कक्षाओं का उपयोग करते हैं न कि प्रकार। सभी डेटा में एक वर्ग होता है।

12345.class

'my string'.class

उनके पूर्वज भी हो सकते हैं

Object.ancestors

उनके पास मेटा क्लासेस भी हैं, लेकिन मैं उस पर आपके विवरण को सहेज कर रखूँगा।

एक बार जब आप कक्षा को जान लेते हैं तो आप यह देख पाएंगे कि आप इसके लिए किन विधियों का उपयोग कर सकते हैं। यहीं पर "डेटा टाइप" की जरूरत होती है। यदि आप वास्तव में विवरण देखना चाहते हैं ...

"रूबी ऑब्जेक्ट मॉडल"

यह वह शब्द है जिसका उपयोग रूबी वस्तुओं को कैसे संभालता है। यह सब आंतरिक है इसलिए आपको वास्तव में इसका बहुत कुछ नहीं दिखता है लेकिन यह जानना अच्छा है। लेकिन यह एक और विषय है।

हाँ! वर्ग डेटा प्रकार है। ऑब्जेक्ट में कक्षाएं होती हैं और डेटा के प्रकार होते हैं। इसलिए यदि आप डेटा बेस के बारे में जानते हैं तो आप जानते हैं कि केवल प्रकार के सीमित सेट हैं।

पाठ ब्लॉक संख्या


उदाहरण के लिए,Object.ancestors # => [Object, Kernel, BasicObject]
डोरियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.