2008-09-04 7 views
24

सरल सवाल, लेकिन एक जिसे मैं उत्सुकता से जानता हूं ... क्या निम्नलिखित दो आदेशों के बीच एक कार्यात्मक अंतर है?क्या :: और के बीच कोई अंतर है। रूबी में वर्ग विधियों को बुलाते समय?

String::class 
String.class 

वे दोनों मैं क्या उम्मीद करते हैं - कि वे लौट Class कहने के लिए है - लेकिन :: और . का उपयोग कर के बीच अंतर क्या है?

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

उत्तर

35

. ऑपरेटर मूल रूप से "ऑब्जेक्ट को यह संदेश भेजें" कहता है। आपके उदाहरण में यह उस विशेष सदस्य को बुला रहा है। :: ऑपरेटर ऑपरेटर के बाईं ओर परिभाषित दायरे में "ड्रिल डाउन" करता है, और उसके बाद ऑपरेटर के दाईं ओर परिभाषित सदस्य को कॉल करता है।

जब आप :: का उपयोग करते हैं तो आपको परिभाषित सदस्यों को संदर्भित करना होगा। . का उपयोग करते समय आप ऑब्जेक्ट को बस एक संदेश भेज रहे हैं। चूंकि वह संदेश कुछ भी हो सकता है, ऑटो-पूर्णता . के लिए काम नहीं करती है, जबकि यह :: के लिए होती है।

11

असल में, स्वत: पूर्णता . के लिए काम करती है। ऑब्जेक्ट पर #methods पर कॉल करके पूरा करने के विकल्प मिलते हैं। आप खुद के लिए यह देख सकते हैं Object.methods अधिभावी द्वारा:

>> def Object.methods; ["foo", "bar"]; end 
=> nil 
>> Object.[TAB] 
Object.foo Object.bar 
>> Object. 

ध्यान दें कि यह केवल काम करता है जब . के बाईं ओर अभिव्यक्ति एक शाब्दिक है। अन्यथा, ऑब्जेक्ट को #methods पर कॉल करने के लिए बाएं हाथ की तरफ मूल्यांकन करना शामिल होगा, जिसमें दुष्प्रभाव हो सकते हैं। साथ ही आप खुद के लिए यह देख सकते हैं:

[continuing from above...] 
>> def Object.baz; Object; end 
=> nil 
>> Object.baz.[TAB] 
Display all 1022 possibilities? (y or n) 

हम Object जो Object ही रिटर्न के लिए एक विधि #baz जोड़ें। फिर हम Object.baz पर कॉल करने के तरीकों को प्राप्त करने के लिए स्वतः पूर्ण हो जाते हैं। अगर आईआरबी को Object.baz.methods कहा जाता है, तो यह Object.methods जैसा ही होगा। इसके बजाय, आईआरबी के पास 1022 सुझाव हैं। मुझे यकीन नहीं है कि वे कहां से आते हैं, लेकिन यह स्पष्ट रूप से एक सामान्य सूची है जो वास्तव में संदर्भ पर आधारित नहीं है।

:: ऑपरेटर (मॉड्यूल) मॉड्यूल के स्थिरांक प्राप्त करने के लिए भी उपयोग किया जाता है, जबकि . नहीं है। यही कारण है कि HTTPNet:: के पूरा होने में दिखाई देगा, लेकिन Net. के लिए नहीं। Net.HTTP सही नहीं है, लेकिन Net::HTTP है।

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