2010-06-26 21 views
8

उदाहरण के लिए, मैंने हमेशा String#split के रूप में संदर्भित विधियों को देखा है, लेकिन String.split कभी नहीं, जो थोड़ा अधिक तार्किक लगता है। या शायद String::split, क्योंकि आप #split पर String के नामस्थान में रहने के लिए विचार कर सकते हैं। मैंने अकेले विधि को भी देखा है, जब कक्षा ग्रहण/निहित (#split) है।रूबी में पहचान विधियों के # सम्मेलन के लिए तर्क/इतिहास क्या है?

मैं समझता हूं कि इस तरह से विधियों की पहचान की जाती है। जो पहले आया था?

क्या यह अलग-अलग है, उदाहरण के लिए, फ़ील्ड से तरीकों? मैंने यह भी सुना है कि यह वर्ग विधियों से उदाहरण विधियों को अलग करने में मदद करता है। लेकिन यह कहां से शुरू हुआ?

+0

मैं जानना चाहता हूं कि रूबी के नामकरण सम्मेलनों पर चर्चा करते समय पुस्तकें/ट्यूटोरियल में इस सम्मेलन का उल्लेख/व्याख्या क्यों नहीं किया गया है। मैंने विभिन्न चर्चाओं में '#' उपसर्ग के साथ विधि नाम देखने में भ्रमित पाया और केवल यह अनुमान लगाने में सक्षम था कि उपसर्ग का क्या महत्व था। तथ्य यह है कि '# '.rb स्रोत में एक टिप्पणी शुरू करता है यह दोगुना भ्रमित करता है। जैसा कि आप कल्पना कर सकते हैं, यह खोजना सबसे आसान बात नहीं है, इसलिए इसे कहीं पूछने के लिए धन्यवाद, मैं उस पर ठोकर खा सकता था। मुझे आश्चर्य है कि अगर मैं 6 महीने के गैर-रूबी गतिविधि में इन विवरणों को भूल जाता हूं तो मैं इसे फिर से ढूंढ पाऊंगा ... –

उत्तर

8

अंतर यह इंगित करता है कि आप विधियों तक कैसे पहुंचते हैं।

कक्षा तरीकों, संकेत मिलता है कि संदेश वर्ग/मॉड्यूल वस्तु के लिए भेजा जा सकता है, जबकि उदाहरण तरीकों संकेत मिलता है कि संदेश एक उदाहरण वस्तु के लिए भेजा जा सकता है # विभाजक का उपयोग :: विभाजक का उपयोग करें।

मैं अंतर दिखाने के लिए Complex वर्ग (रूबी 1.9 में) चुनने जा रहा हूं। आपके पास Complex::rect और Complex#rect दोनों हैं। इन तरीकों में अलग-अलग धैर्य हैं और वे पूरी तरह से अलग-अलग उद्देश्यों की सेवा करते हैं। Complex::rect एक असली और एक काल्पनिक तर्क लेता है, Complex का एक नया उदाहरण लौटाता है, जबकि Complex#rect उदाहरण के वास्तविक और काल्पनिक घटकों की एक सरणी देता है।

ruby-1.9.1-p378 > x = Complex.rect(1,5) 
=> (1+5i) 
ruby-1.9.1-p378 > x.rect 
=> [1, 5] 
ruby-1.9.1-p378 > x.rect(2, 4) # what would this even do? 
ArgumentError: wrong number of arguments(2 for 0) 
    from (irb):4:in `rect' 
    from (irb):4 
    from /Users/mr/.rvm/rubies/ruby-1.9.1-p378/bin/irb:17:in `<main>' 

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

इसके अलावा, यह एक पूरी तरह से असंबंधित विषय के कुछ क्षेत्रों से है, क्योंकि सभी संदेशों को भेज सकते हैं संदेश होते हैं, ठीक से बोल रहा, भले ही वह एक सार्वजनिक रूप से सुलभ क्षेत्र की तरह दिखता है। फ़ील्ड में आपके पास सबसे नज़दीकी चीज विशेषताएँ या आवृत्ति चर हैं, जो हमेशा @ के साथ प्रीफ़िक्स किए जाते हैं और सीधे उदाहरण के बाहर से सुलभ नहीं होते हैं जब तक आप विरासत या Object#instance_variable_get/_set का उपयोग नहीं कर रहे हैं।

विशेष रूप से उन्होंने :: और # क्यों चुना? :: मुझे समझ में आता है क्योंकि यह परंपरागत रूप से नेमस्पेस को अलग करता है, लेकिन # शायद एक प्रतीक था जिसका उपयोग अन्य नामकरण में नहीं किया गया था और अनजाने में एक इंस्टेंस-विधि विभाजक के रूप में पहचाना जा सकता था।

+0

अब बोनस प्वाइंट्स के लिए: क्यों नहीं * * '' 'का उपयोग * विधियों का उपयोग करते समय' # 'उदाहरण विधियों का आह्वान करने के लिए? फिर दस्तावेज़ों और वास्तविक कोड में पढ़ने में कोई अस्पष्टता नहीं है। –

+0

@ जस्ट: आप * कॉम्प्लेक्स :: रेक्ट (1,5) 'कर सकते हैं। लेकिन चूंकि '#' एक पंक्ति-टिप्पणी शुरू करता है, मुझे नहीं लगता कि बाद में किसी भी समय अपनाया जा रहा है। –

+1

मुझे इस बारे में पता है। मुद्दा यह है कि यह ''' के बजाय' # 'के साथ दस्तावेज के लिए अभी भी बहुत खराब है। ** विशेष रूप से ** क्योंकि आप '::' के साथ आवेदक कर सकते हैं। यह मेरे लिए रुबी के इन अक्षम रहस्यों में से एक है। चूंकि हमारे पास पहले से ही '@' और '@@' उपसर्ग नियम हैं, इसलिए विधियों और बल (अनुमति नहीं, * बल *) वर्ग विधियों के लिए '::' और बल (अनुमति नहीं है, * के साथ क्यों नहीं किया जाता है) बल *) उदाहरण विधियों को '.' के साथ बुलाया जाना चाहिए? –

3

मैं समझता हूं कि इस तरह से विधियों की पहचान की जाती है। जो पहले आया था?

हां, यह वह जगह है जहां से यह आया था। जब आप # का उपयोग करते हैं, तो यह स्वचालित रूप से आपके तरीकों को हाइपरलिंक करता है, इसलिए प्रलेखन में अन्य विधियों के संदर्भ # चिह्न द्वारा उपसर्ग किए जाने लगे।कक्षाएं, स्रोत फ़ाइलों, और किसी भी विधि एक अंडरस्कोर युक्त या एक हैश चरित्र से पहले स्वचालित रूप से उनके वर्णन करने के लिए टिप्पणी पाठ से हाइपरलिंक रहे नामों में से

नाम: here देखें।

हालांकि आप वास्तव में इस तरह से एक विधि का आह्वान नहीं कर सकते हैं। लेकिन यह आश्चर्यजनक नहीं होना चाहिए; आखिरकार, <cref ...> मान्य दस्तावेज़ टैग होने के बावजूद सी # में एक अवैध कथन है।

+0

तो यह पहली जगह विधियों को हैश द्वारा संदर्भित किया गया था? –

+0

@ जस्टिन एल .: यह किसने सम्मेलन बनाया, हां। –

+0

ऐसा इसलिए था क्योंकि rdoc फ़ाइलों ने एंकर आईडी के रूप में विधि नामों का उपयोग किया था, और एचटीएमएल दस्तावेज़ पहचानकर्ता से स्थान हैश को अलग करने के लिए # का उपयोग करता है? –