2012-12-12 21 views
5

यह देखते हुए कि रूबी में कुछ एक ऑब्जेक्ट है और हम आईआरबी खोलने के लिए और देखने के लिए 4.class और "Text".class तरह बातें टाइप कर सकते हैं कि किस वर्ग एक वस्तु है, क्यों if.class और unless.class नहीं दे से प्रतिलाभ की मात्रा?क्या के वर्ग है "यदि/जब तक" आदि

उत्तर

10

यह देखते हुए कि रूबी में कुछ एक ऑब्जेक्ट

कि "वस्तु" और every- "बात" की अपनी परिभाषा पर निर्भर करता है। "वस्तु" का मतलब "वस्तु प्रणाली का एक सदस्य है कि मूल्य" "इकाई है कि कार्यक्रम द्वारा हेरफेर किया जा सकता" (जो मैं अब से वस्तु फोन करेगा), या (जो मैं लूंगा अब से Object पर कॉल करें)।

रूबी में, सब कुछ है कि कार्यक्रम (अर्थात हर वस्तु) द्वारा हेरफेर किया जा सकता भी एक Object, यानि कि एक वर्ग का एक उदाहरण है। यह जावा के विपरीत है, उदाहरण के लिए, जहां प्राइमेटिव्स प्रोग्राम द्वारा छेड़छाड़ की जा सकती है (यानी ऑब्जेक्ट्स शब्द के अर्थ में), लेकिन Objects नहीं हैं। रूबी में, यह भेद मौजूद नहीं है: प्रत्येक ऑब्जेक्ट एक Object है और प्रत्येक Object भी ऑब्जेक्ट है।

हालांकि, वहाँ बातें भाषा में है, जो नहीं और जो इस कार्यक्रम के द्वारा हेरफेर किया जा सकता नहीं कर रहे हैं एक वर्ग के उदाहरण हैं, जैसे कि वे न तो वस्तु रों है और न ही Object रों हैं। ये, उदाहरण के लिए, विधियों, चर, वाक्यविन्यास, पैरामीटर सूचियां, तर्क सूचियां, कीवर्ड हैं।

नोट: आप एक ऑब्जेक्ट देने के लिए रुबी के प्रतिबिंब एपीआई का उपयोग कर सकते हैं कि एक विधि या पैरामीटर सूची का प्रतिनिधित्व करता है, लेकिन वह ऑब्जेक्ट केवल प्रॉक्सी है, यह वास्तविक चीज़ नहीं है।

तो, जब हम कहते हैं कि "कुछ एक ऑब्जेक्ट है", क्या हम वास्तव में मतलब है कि "हर वस्तु एक Object है", यानी कि सब कुछ जो इस कार्यक्रम के द्वारा हेरफेर किया जा सकता भी का एक सदस्य है है ऑब्जेक्ट सिस्टम, या दूसरे शब्दों में, ऑब्जेक्ट सिस्टम के बाहर कोई मान नहीं है (जावा में प्राइमेटिव के विपरीत)। हम का अर्थ यह नहीं है कि भाषा में मौजूद सभी चीजों को प्रोग्राम द्वारा रनटाइम पर भी इस्तेमाल किया जा सकता है।

क्यों if.class और unless.class कोई वापसी मान देते हैं

खैर, सबसे पहले, यहाँ तक कि अगरif थे एक वस्तु, उन आप क्या सोचते हैं वे करते हैं ऐसा नहीं करते हैं: जब आप रुबी में foo की तरह कुछ कहें, इसका मतलब है कि "स्थानीय चर foo" या "foo विधि self के साथ अंतर्निहित रिसीवर और कोई तर्क सूची के रूप में कॉल करें"। तो,

if.class 

या तो आप वस्तु स्थानीय चर if या वस्तु की श्रेणी संदर्भित वर्ग देना होगा विधि if द्वारा दिया, लेकिन कभी नहींif के ही वर्ग।

लेकिन if नियंत्रण प्रवाह कीवर्ड एक वस्तु, वैसे भी (न तो एक वस्तु है और न ही एक Object) क्योंकि कीवर्ड और नियंत्रण प्रवाह रूबी में ऑब्जेक्ट नहीं है नहीं है।

पुस्तक The Ruby Programming Language by Matz and David Flanagan यह कहते हैं पृष्ठ 2 पर:

हर मूल्य एक वस्तु

नोट है, यह कहना नहीं है every- बात, केवल हर मूल्य

भी देखें प्रश्न Is variable is object in ruby?

+0

बहुत अच्छी व्याख्या, उस लिंक किए गए प्रश्न को शामिल किया गया। धन्यवाद! भ्रमित करने के लिए और अधिक जोड़ने के लिए, http://ruby-doc.org/docs/keywords/1.9/Object.html 'if' ऑब्जेक्ट क्लास की विधि के रूप में सूचीबद्ध है, लेकिन यदि आप keyword.rb पर क्लिक करते हैं तो यह कहता है" हां, मुझे पता है कि वे विधियां नहीं हैं। मैंने उन्हें परिचित आरडीओसी आउटपुट बनाने के लिए बस उस प्रारूप में रखा है। " तो 'if' सिर्फ एक कीवर्ड है हालांकि इसे किसी ऑब्जेक्ट के रूप में बनाया जा सकता था और कीवर्ड ऑब्जेक्ट्स के रूप में कार्य नहीं करते थे। – user1894919

4

क्योंकि वे भाषा कीवर्ड हैं और ऑब्जेक्ट्स नहीं हैं। आम तौर पर, आप एक चर को आवंटित कर सकते हैं सब कुछ एक वस्तु है।

तकनीकी रूप से सही होने के लिए: इस तरह के unlessहो सकता है के रूप में कीवर्ड एक वर्ग है कि संकलक/दुभाषिया द्वारा प्रयोग किया जाता है (एक वास्तविक कार्यान्वयन पर निर्भर करता है), लेकिन आप ऐसी भाषा उपयोगकर्ता के रूप में, किसी भी भी दूर से व्यावहारिक नहीं है इसके लिए उपयोग करें और इसलिए यह आपके सामने नहीं आया है।

1
1.9.2-p320 :019 > def meth 
1.9.2-p320 :020?> 'meth' 
1.9.2-p320 :021?> end 
=> nil 
1.9.2-p320 :022 > 

आप प्रश्न चिह्न और खरोज दिखाई देती है तो जब आईआरबी कुछ है कि निरंतरता की जरूरत का पता लगाता है, यह indents।

1.9.2-p320 :022 > if.class 
1.9.2-p320 :023?> ... 
1.9.2-p320 :028?> end 
SyntaxError: (irb):22: syntax error, unexpected '.' 
if.class 
^
(irb):28: syntax error, unexpected keyword_end, expecting $end 

1.9.2-p320 :045 > if.if 
1.9.2-p320 :046?> end 
SyntaxError: (irb):45: syntax error, unexpected '.' 
if.if 
^

1.9.2-p320 :060 > str = 'abc' 
=> "abc" 
1.9.2-p320 :061 > str. 
1.9.2-p320 :062 > length 
=> 3 
1.9.2-p320 :063 > 
1.9.2-p320 :083 > if 
1.9.2-p320 :084 >  str 
1.9.2-p320 :085?> puts '>>>' 
1.9.2-p320 :086?> end 
>>> 
=> nil 
1.9.2-p320 :087 > 

आप देख सकते हैं, आईआरबी तुरंत उत्तर नहीं मिलता है, इस तरह के एक आरक्षित शब्द को कोई संदेश भेजने के रूप में एक स्पष्ट गलती है, भले ही। द? यह संकेत है कि यह बाकी बयान के लिए इंतजार कर रहा है।