2012-03-13 15 views
7

rescue जो एक चर प्रदान करती सकता संदर्भ के लिए त्रुटि वस्तु इस वाक्य रचना (=>)'बचाव' विधि के चर के लिए त्रुटि ऑब्जेक्ट असाइन करने में प्रयुक्त वाक्यविन्यास (=>) क्या है?

rescue => e 
तो rescue

सामान्य विधि कॉल में से एक है, => का अर्थ क्या है। क्या मैं अन्य विधि कॉल पर एक ही वाक्यविन्यास का उपयोग कर सकता हूं?

my_method arg1, arg2 => my_obj 
+3

क्या आपका मतलब है 'बचाव => ई'? 'raise => ई' मान्य रूबी नहीं है। –

+0

क्षमा करें। 'बचाव => ई' – steveyang

+0

नहीं, यह एक वाक्य रचनात्मक निर्माण है। Http://stackoverflow.com/questions/9669128/ruby-rescue-like-syntax#comment12281753_9669128 देखें, मुझे आश्चर्य है कि यह अचानक क्यों पूछा जा रहा है। –

उत्तर

4

जबकि raise is indeed a method, rescue नहीं है। यह एक कीवर्ड है और parse.y:10467 पर परिभाषित किया गया है। इस प्रकार, आपके पास वाक्यविन्यास rescue के लिए विशेष है (=> e किसी भी प्रकार का विधि तर्क नहीं है), और विधियों के लिए मान्य नहीं है (कम से कम एक ही अर्थ के साथ नहीं)। कैसे/कहाँ rescue => e वाक्यविन्यास स्वयं पार्सर में परिभाषित किया गया है, मैं पूरी तरह से सुनिश्चित नहीं हूं।

0

नहीं, बचाव में वाक्यविन्यास केवल वहां उपयोग किया जाता है। यदि आप हैश रॉकेट '=>' का उपयोग किसी फ़ंक्शन कॉल में करते हैं, तो इसे हैश के रूप में समझा जाएगा, और यदि arg2 को पहले एक चर के रूप में परिभाषित नहीं किया गया था, तो यह एक त्रुटि होगी।

def foo(a,b) 
    puts b.inspect 
end 

foo "bar", :baz => 5 #=> {:baz=>5} 

foo "bar", baz => 5 #=> NameError: undefined local variable or method `baz' 

baz = "flux" 

foo "bar", baz => 5 #=> {"flux"=>5} 
4

कुछ फुटबॉल कोच/दार्शनिक-राजा कह सकते हैं, यह वही है। रूबी का parse.y है। विशेष के हित this part है:

opt_rescue  : keyword_rescue exc_list exc_var then 
        compstmt 
        opt_rescue 
        ... 
       | none 
       ; 

exc_list  : arg_value 
        ... 
       | mrhs 
        ... 
       | none 
       ; 

exc_var   : tASSOC lhs 
        ... 
       | none 
       ; 

स्पष्टीकरण
exc_list मूल रूप से कुछ भी नहीं है, एक अपवाद प्रकार, या एक (splatted) की तरह rescue ZeroDivisionError, LoadError

exc_var अपवादों की श्रृंखला हो सकती है कुछ भी नहीं है या => some_variable

की अनुमति देता है

opt_rescue इसलिए rescue या तो या तो या तो दोनों या दोनों के ऊपर हो सकता है।

यह केवल अपवादों के लिए असाइनमेंट के लिए विशेष वाक्यविन्यास के रूप में सूचीबद्ध है। => के लिए एकमात्र अन्य उपयोग key-value association के लिए है।

भी ध्यान रखें कि arg_value और mrhs बाएं हाथ की ओर पर हैं और lhs दाएँ हाथ की ओर है, जो के रूप में दूर है के रूप में मैं केवल जगह है जहाँ यह तब होता है बता सकते हैं पर है। अगर मैं यहां गलत हूं तो कोई मुझे सही करेगा, लेकिन parse.y में कोई अन्य "पिछड़ा" असाइनमेंट नहीं है।

+1

गाह मैं उन सब पर चला गया और किसी भी तरह से 'exc_var' चूक गया। अच्छा खोज –