2013-07-23 6 views
31

इस रूबी 2.0 कोड में समस्या क्या है?अप्रत्याशित वापसी (LocalJumpError)

p (1..8).collect{|denom| 
    (1...denom).collect{|num| 
     r = Rational(num, denom) 
     if r > Rational(1, 3) and r < Rational(1, 2) 
      return 1 
     else 
      return 0 
     end 
    } 
}.flatten 

त्रुटि block (2 levels) in <main>': unexpected return (LocalJumpError) में है। मैं एक फ्लैट सूची बनाना चाहता हूं जिसमें n वाले (और बाकी शून्य) जहां n 8 से नीचे denominators के साथ तर्कसंगत संख्याओं की संख्या है जो 1/3 और 1/2 के बीच हैं। (it's a Project Euler problem)। तो मैं भीतरी ब्लॉक से वापस लौटने की कोशिश कर रहा हूँ।

+2

ब्लॉक में 'वापसी' का उपयोग न करें। बस 'वापसी' दोनों को हटा दें और आपका कोड ठीक रहेगा। – oldergod

उत्तर

37

आप रूबी * में किसी ब्लॉक के अंदर return नहीं कर सकते हैं। पिछले बयान वापसी मान हो जाता है, तो आप सिर्फ अपने मामले में वापसी बयान निकाल सकते हैं:

p (1..8).collect{|denom| 
    (1...denom).collect{|num| 
     r = Rational(num, denom) 
     if r > Rational(1, 3) and r < Rational(1, 2) 
      1 
     else 
      0 
     end 
    } 
}.flatten 

*: आप अंदर lambda ब्लॉक कर सकते हैं: lambda { return "foo" }.call # => "foo"। इसे स्कॉइंग और उसके साथ करना है, और यह lambda ब्लॉक और proc ब्लॉक के बीच मुख्य अंतरों में से एक है। आपके द्वारा विधियों को पास किए जाने वाले "सामान्य" ब्लॉक proc ब्लॉक की तरह अधिक हैं।

+55

आप * रुबी में एक ब्लॉक के अंदर 'वापसी' का उपयोग कर सकते हैं। यह संलग्न विधि से वापस आ जाएगा। इस मामले में, वहां * कोई * संलग्न विधि नहीं है, * यह है कि * एक त्रुटि क्यों है, यह * नहीं * है क्योंकि ब्लॉक में 'वापसी' अवैध है। –

+0

@ JörgWMittag आप सही हैं, मैं सरल था। निकटतम विधि * या * 'लैम्ब्डा' ब्लॉक के लिए 'रिटर्न' रिटर्न जो आप अंदर हैं। यदि आप किसी के अंदर नहीं हैं, तो आपको 'लोकलजंपरर' मिलेगा। – henrikhodne

+0

@ JörgWMittag इस स्पष्टीकरण कथन के लिए धन्यवाद। जवाब उलझन में था और आपने इसे स्पष्ट किया। मैं अब समझता हूं कि यह त्रुटि आसानी से आईआरबी में क्यों आती है। –

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