2013-03-22 8 views
11

के अंदर रिटर्न स्टेटमेंट्स मुझे यह समझने में बहुत परेशानी हो रही है कि return ब्लॉक, प्रोसेस और लैम्बडा में कैसे काम करता है।procs, lambdas, और ब्लॉक

उदाहरण के लिए, निम्न मामले में, batman_ironman_proc क्यों काम करता है, जबकि batman_yield कोई त्रुटि नहीं फेंकती है?

def batman_ironman_proc 
    victor = Proc.new { return "Batman will win!" } 
    victor.call 
    "Iron Man will win!" 
end 

def batman_yield 
    yield 
    "Iron man will win!" 
end 

victor = Proc.new { return "Batman will win!" } 

puts batman_ironman_proc 
#batman_yield(&victor) === This code throws an error. 
+0

रूबी ब्लॉक में 'वापसी' का उपयोग करने के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2325471/using-return-in-a-ruby-block) – mgibsonbr

+1

यहां: http: // stackoverflow। कॉम/प्रश्न/1435743/क्यों-करता-स्पष्ट-वापसी-मेक-ए-फर्क-इन-ए-प्रो – fmendez

+0

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

उत्तर

9

जुड़ा हुआ प्रश्न में one answer के रूप में दिखाता है:

return कीवर्ड हमेशा विधि या वर्तमान संदर्भ में लैम्ब्डा से लौट आता है। ब्लॉक में, यह उस विधि से वापस आ जाएगा जिसमें बंद परिभाषित था। इसे विधि या लैम्बडा से कॉल करने के लिए वापस नहीं किया जा सकता है। क्योंकि आप एक ही समारोह आप से वापस जाने के लिए चाहता था में victor परिभाषित है, इसलिए एक return उस संदर्भ में कानूनी था

आपका पहला उदाहरण सफल रहा था। आपके दूसरे उदाहरण में, victor को शीर्ष-स्तर में परिभाषित किया गया था। return का प्रभाव, तो batman_yield (कॉलिंग विधि) से वापस लौटना होगा, लेकिन [यदि यह वैध था] शीर्ष-स्तर से वापस लौटने के लिए (जहां Proc परिभाषित किया गया था)।

स्पष्टीकरण: जबकि आप किसी ब्लॉक के वापसी मूल्य तक पहुंच सकते हैं (यानी "ब्लॉक में मूल्यांकन की गई अंतिम अभिव्यक्ति का मूल्य उपज के मूल्य के रूप में विधि में वापस भेज दिया जाता है" - आपकी टिप्पणी के अनुसार) , ऊपर बताए गए कारण के लिए return कीवर्ड का उपयोग नहीं कर सकता है। उदाहरण:

def batman_yield 
    value = yield 
    return value 
    "Iron man will win!" 
end 

victor = Proc.new { return "Batman will win!" } 
victor2 = Proc.new { "Batman will win!" } 

#batman_yield(&victor) === This code throws an error. 
puts batman_yield(&victor2) # This code works fine. 
+1

यह देखते हुए कि यह मामला है, जैसे तर्क खोजने के तरीके, जो तर्क परीक्षणों के साथ ब्लॉक स्वीकार करते हैं, उन तर्क परीक्षणों के परिणामों का उपयोग करते हैं? (उदाहरण: [1,2,3,4,8,10]। ढूँढें {| num | num * num> 24}) – voltair

+0

@ user1419674 अद्यतन उत्तर देखें। वैसे ही आपका उदाहरण कोड 'रिटर्न' का उपयोग नहीं करता है, आपको ब्लॉक के मूल्यांकन तक पहुंचने के लिए इसका उपयोग करने की ज़रूरत नहीं है। आप सीधे 'कॉल' से रिटर्न वैल्यू का उपयोग कर सकते हैं, इसका उपयोग सीधे (मेरे उदाहरण कोड में) या इसे एक वैरिएबल (पूर्व .: 'value = block.call') – mgibsonbr

+0

पर असाइन करना यह मेरे लिए बहुत अजीब है, लेकिन मैं मान लें कि यह लिंक प्रश्न का उत्तर प्रदान करता है। [लिंक] http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_containers.html यह वास्तव में कहता है कि उपज वापसी मूल्य प्रदान कर सकती है। इस बारे में मुझे इतना अजीब बात यह है कि इस मामले में ऐसा लगता है कि एक स्पष्ट वापसी और एक निहित वापसी ब्लॉक के भीतर अलग-अलग परिणाम उत्पन्न करती है। – voltair

0

मैं एक सी पृष्ठभूमि से आ रहा हूँ और जिस तरह से मैं इसे समझा जाएगा जब आप एक समारोह आप एक वापसी अनुदेश संख्या और एक रजिस्टर जो दिए गए मान स्टोर करेगा सेट कहते हैं। प्रो और ब्लॉक के मामले में रिटर्न निर्देश सेट नहीं किया गया है क्योंकि उन्हें एक ही दायरे में रेखांकित या बुलाया जाता है लेकिन वे अभी भी एक लौटा मूल्य वापस दे सकते हैं क्योंकि ये स्वतंत्र कार्यक्षमताएं हैं। इसलिए, एक रिटर्न निर्देश के बिना proc/block सेट किए जा रहे हैं, तो हमें एक स्थानीय जंप त्रुटि मिल रही है, जबकि अगर हम सिर्फ एक मूल्य वापस देना चाहते हैं जो ठीक है।

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