2009-05-15 5 views
5

निम्नलिखित कोड ठीक काम करता है:रिटर्न कीवर्ड मेरे 'अगर ब्लॉक' में समस्या क्यों उत्पन्न करता है?

person = {:a=>:A, :b=>:B, :c=>:C} 
berson = {:a=>:A1, :b=>:B1, :c=>:C1} 

kerson = person.merge(berson) do | key, oldv, newv | 
if key == :a 
    oldv 
elsif key == :b 
    newv 
else 
    key 
end 
end 

puts kerson.inspect 

लेकिन अगर मैं "अगर ब्लॉक" अंदर return जोड़ने के लिए, मैं एक त्रुटि मिलती है:

person = {:a=>:A, :b=>:B, :c=>:C} 
berson = {:a=>:A1, :b=>:B1, :c=>:C1} 

kerson = person.merge(berson) do | key, oldv, newv | 
if key == :a 
    return oldv 
elsif key == :b 
    return newv 
else 
    return key 
end 
end 

puts kerson.inspect 

ऊपर कोड से त्रुटि है:

unexpected return (LocalJumpError) 

क्या कोई इसे समझा सकता है? मैंने सोचा कि return वैकल्पिक रूप से उपयोग किया जा सकता है जहां भी पहले से ही मूल्य लौटने की धारणा है।

उत्तर

12

त्रुटि का कारण यह है कि ब्लॉक में वास्तव में अपना स्वयं का दायरा नहीं है जो वे वापस लौटते हैं - एक ब्लॉक से वापसी आसपास के तरीके से लौटने के बराबर होती है। यहां आस-पास की विधि क्या है? कोई नहीं है - यह शीर्ष स्तर पर है, इसलिए यह ruby -e "return" करने के बराबर है, जो आपको एक ही त्रुटि देगा। यदि आप इसे किसी विधि के अंदर चिपकते हैं, तो यह विधि को निष्पादित होने वाले आईफ़-क्लॉज की पहली शाखा का मान वापस कर देगा।

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