2009-08-07 15 views
21

मेरे पास रूबी के तरीकों, प्रक्रियाओं और ब्लॉक के बारे में कुछ प्रश्न हैं जो मुझे अजीब तरह से मारते हैं। वे सिंटैक्स या फ़ंक्शन के बारे में बहुत कुछ नहीं हैं जो निर्णय के पीछे तर्क के रूप में हैं।रूबी विधि, प्रो, और ब्लॉक भ्रम

प्रश्न 1:

ऐसा क्यों है कि ब्लॉक के तरीकों को पारित किया जा सकता है (उदाहरण के लिए प्रत्येक), लेकिन वे एक चर को सौंपा नहीं जा सकता है?

मुझे पता है कि आप प्रक्रियाओं में उन्हें पास कर सकते हैं, यानी p = Proc.new {...} (&p के साथ एक्सेस किया गया), लेकिन प्रोग्रामर इन माध्यमों से गुजरने के लिए ज्यादा समझ में नहीं आता है।

प्रश्न 2:

क्यों तरीकों और प्रक्रियाओं के बीच एक भेदभाव है?

def square(x) 
    x**2 
end 

square(3) 
=> 9 

या

square = lambda {|x| x**2} 
square.call(3) 
=> 9 

क्यों भेदभाव:

उदाहरण के लिए, मैं निम्नलिखित दो तरह से एक समारोह को परिभाषित करने और उस समारोह को बुलाने की कार्य को पूरा कर सकते हैं? पायथन में उदाहरण के लिए मानक तरीके से एक फ़ंक्शन को परिभाषित करना और square = lambda x: x**2 द्वारा फ़ंक्शन बनाने और इसे square पर असाइन करने का एक ही कार्य पूरा करें।

उत्तर

20

प्रश्न 1: ब्लॉक वे वाक्यात्मक संरचनाओं हैं, वस्तुओं नहीं हैं; यही कारण है कि वे एक चर के लिए असाइन नहीं किया जा सकता है। यह वस्तुओं के लिए आरक्षित एक विशेषाधिकार है।

प्रश्न 2: तरीके वस्तुएं नहीं हैं, इसलिए वे संदेश प्राप्त नहीं कर सकते हैं। उलटा, procs और lambdas वस्तुएं हैं, इसलिए उन्हें विधियों की तरह नहीं बुलाया जा सकता है, लेकिन उन्हें एक संदेश प्राप्त करना होगा जो उन्हें संदेश के साथ पारित पैरामीटर के आधार पर मूल्य वापस करने के लिए कहता है।

Procs और lambdas वस्तुओं रहे हैं, ताकि वे call संदेश प्राप्त कर सकते हैं और नाम को सौंपा जा। संक्षेप में, यह एक ऐसी वस्तु है जो प्रोसेस और लैम्बडास को अजीब तरीके से व्यवहार करती है। तरीके और ब्लॉक वस्तुएं नहीं हैं और उस व्यवहार को साझा नहीं करते हैं।

+5

रूबी का दावा कुछ एक ऑब्जेक्ट है। ब्लॉक के साथ फिट होने के लिए वस्तुओं को होना चाहिए, और उन्हें तर्क के रूप में पारित किया जा सकता है, इसलिए वे निश्चित रूप से कुछ तरीकों से वस्तुओं की तरह कार्य करते हैं। – rpjohnst

+6

ब्लॉक, उन्हें एक वस्तु या एक लैम्ब्डा का प्रतिनिधित्व करने के लिए ऑब्जेक्ट बनाने के माध्यम से वस्तुओं की तरह कार्य करने के लिए बनाया जा सकता है। उस डिवाइस के बिना, वे सिर्फ वाक्य रचनात्मक संरचनाएं हैं। – Pinochle

+0

ब्लॉक ऑब्जेक्ट्स हैं - यह लैम्ब्डा का उद्देश्य है {जो भी}। – Chuck

4

तरीके विधियां हैं - यानी, वे क्रियाएं हैं जो किसी संदेश को संदेशों के जवाब में ले सकती हैं। वे काम नहीं कर रहे हैं।

ब्लाकों बंद हैं - वे कार्यों संलग्न गुंजाइश खत्म हो गया बंद है कि कर रहे हैं। वे अवधारणात्मक रूप से किसी दिए गए वस्तु से संबंधित नहीं हैं।

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

5

कुछ हद तक कम से कम, तरीकों वस्तुओं रहे हैं:

class ABC 
    def some_method 
    end 
end 
ABC.instance_method(:some_method) #=> #<UnboundMethod: ABC#some_method> 
इसके अलावा कि करने के लिए

, वहाँ है एक निर्मित वर्ग: विधि, के रूप में दस्तावेज here

भी इस देखें: http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls

संयोग से <bseg>, यह नहीं बल्कि सब कुछ-है-एक-वस्तु बात बाहर सहन करने के लिए प्रतीत होता है। इस विशेष मामले में, यह देखने के लिए थोड़ा और खुदाई लगती है।

(मैं वास्तव में समझने का प्रयास करना चाहिए यह बेहतर: मैं इसे एक गहरी समझ प्राप्त करने के लिए मौलिक है सोचने के लिए शुरू कर रहा हूँ।)

+0

तरीके 'ऑब्जेक्ट' के उदाहरणों से अपना ऑब्जेक्ट लेते हैं। 'विधि' के लिए' ri' दस्तावेज़ में, शब्द 'विधि' का प्रयोग स्पष्टीकरण में नहीं किया जाता है, लेकिन 'proc' है। दोनों वर्गों को एक ही संदेश प्राप्त होते हैं, लेकिन अंतर यह है कि उन्हें कैसे बुलाया जाता है और इस तथ्य में कि विधियों को किसी अन्य वस्तु के नामस्थान के भीतर परिभाषित किया गया है, जहां प्रो को 'कॉल' विधि को लागू करने और अस्तित्व में रखने की आवश्यकता होती है (जारी रखें, मैंने पहले कहा) स्वतंत्र रूप से अन्य वस्तुओं के। – Pinochle

+0

आह, एक और अंतर ... 'विधि' को 'नया' संदेश प्राप्त नहीं होता है, जहां 'Proc' करता है। यदि विधियां वस्तुएं हैं, तो वे पूरी तरह से वस्तुओं ('पूर्ण' अर्थ नहीं हैं जिसका अर्थ है कि हम सभी विशेषताओं को वस्तुओं में देखने के लिए उपयोग किए जाते हैं)। – Pinochle

+0

वह विकीबुक्स लिंक सहायक है। धन्यवाद। – David

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