2012-03-13 15 views
5

The Ruby Programming Language पी .164 के अनुसार।एक प्रारंभ ब्लॉक का मूल्य निर्धारित कैसे किया जाता है?

एक begin बयान एक अपवाद का प्रचार नहीं करता है, तो मूल्य बयान के पिछले अभिव्यक्ति begin, rescue या else खंड में मूल्यांकन का मूल्य है।

लेकिन मैं इस व्यवहार के अनुरूप पाया बाकी खंड के साथ एक साथ ब्लॉक शुरू और खंड करता है।

def fact (n) 
    raise "bad argument" if n.to_i < 1 
end 

value = begin 
    fact (1) 
rescue RuntimeError => e 
    p e.message 
else 
    p "I am in the else statement" 
ensure 
    p "I will be always executed" 
    p "The END of begin block" 
end 

p value 

उत्पादन होता है:

"I am in the else statement" 
"I will be always executed" 
"The END of begin block" 
"I am in the else statement" 
[Finished] 

valueबाकी खंड लिए मूल्यांकन किया जाता है

यहाँ उदाहरण कोड है। यह असंगत व्यवहार है क्योंकि सुनिश्चित करें कि खंड अंतिम कथन निष्पादित किया गया है।

कोई व्यक्ति बता सकता है कि प्रारंभिक ब्लॉक में क्या हो रहा है?

+0

"कोड के ब्लॉक पिछले बयान निष्पादित के लिए मूल्यांकन किया जाता है"। यह स्पष्ट रूप से एक गलत धारणा है। –

+0

क्षमा करें, अधिक विशिष्ट कथन और संदर्भ के साथ सही है। – steveyang

+2

अब आपने खुद से सवाल का जवाब दिया: "शुरू करें, बचाव करें या अन्यथा" वास्तव में सही क्रम है, इसलिए यह विनिर्देश के अनुरूप है। –

उत्तर

4

मैं के लक्ष्य को यह लगेगा begin/rescue/else/end ब्लॉक के रूप में:

  • else अनुभाग में कोड begin अनुभाग में कोड का निष्पादन करें, और उसके बाद।
  • अगर begin अनुभाग में कुछ गलत हो जाता है, तो else अनुभाग के बजाय rescue अनुभाग निष्पादित करें।

तो या तोrescue अनुभाग या else अनुभाग begin अनुभाग कोशिश कर के बाद निष्पादित किया जाएगा; इसलिए यह समझ में आता है कि उनमें से एक को पूरे ब्लॉक के मूल्य के रूप में उपयोग किया जाएगा।

यह केवल एक दुष्प्रभाव है कि ensure अनुभाग हमेशा निष्पादित किया जाएगा।

val = begin 
    p "first"; "first" 
rescue => e 
    p "fail"; "fail" 
else 
    p "else"; "else" 
ensure 
    p "ensure"; "ensure" 
end 

val # => "else" 
# >> "first" 
# >> "else" 
# >> "ensure" 

लेकिन:

val = begin 
    p "first"; "first" 
    raise 
rescue => e 
    p "fail"; "fail" 
else 
    p "else"; "else" 
ensure 
    p "ensure"; "ensure" 
end 

val # => "fail" 
# >> "first" 
# >> "fail" 
# >> "ensure" 
0

मैं बस अनुमान लगा रहा हूं, लेकिन एक सुनिश्चित ब्लॉक के उद्देश्य को ऐसे किसी भी संसाधन को अंतिम रूप देना है जो खुला रहता है (दूसरे शब्दों में सफाई), और इसलिए यह समझ में आता है कि तार्किक मूल्य का परिणाम होना चाहिए अन्य कथन। यह मुझे समझ में आता है कि यह डिजाइन द्वारा है।

0

इस मामले में begin ब्लॉक एक ऐसा अनुभाग परिभाषित करने का एक तरीका है जिसके लिए आप अपवाद हैंडलिंग करना चाहते हैं।

याद रखें कि else इस मामले में कोई अपवाद नहीं होता है, और ensure अपवादों या इसकी कमी के बावजूद चलाएगा।

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