2010-04-12 15 views
7

रूबी में आप किसी भी त्रुटि को पकड़ने के लिए असाइनमेंट के अंत में rescue लिख सकते हैं। मेरे पास एक फ़ंक्शन है (नीचे: a_function_that_may_fail) जहां कुछ शर्तों को पूरा नहीं किया गया है, तो इसे एक त्रुटि फेंकना सुविधाजनक है। निम्नलिखित कोड अच्छी तरह से`var = कुछ बचाव शून्य व्यवहार

post = {} 
# Other Hash stuff 
post['Caption'] = a_function_that_may_fail rescue nil 

काम करता है फिर भी मैं पोस्ट [ 'कैप्शन'] भी सेट नहीं समारोह में विफल रहता है, तो करना चाहते हैं।

मैं जानता हूँ कि मैं कर सकते हैं:

begin 
    post['Caption'] = a_function_that_may_fail 
rescue 
end 

लेकिन यह है कि एक छोटे से अत्यधिक महसूस करता है - वहाँ एक सरल समाधान है?

def this_may_fail 
    some_logic rescue nil 
end 

आप तो उपयोग कर सकते हैं संशोधक अपने विधि की वापसी मान की जाँच करें और केवल अगर यह nil या false नहीं है मान देना:

+0

समारोह नए सिरे से लिखना नहीं वास्तव में एक विकल्प है, इसकी एक Nokogiri खोज है - अनिवार्य रूप से मैं अगर वहाँ एक विशिष्ट XML तत्व होता है 'कैप्शन' हैश आइटम सेट करना चाहते हैं, लेकिन महत्वपूर्ण बात, यह सेट नहीं करता है, तो है कि XML तत्व वहां नहीं है। –

उत्तर

19

समस्या प्राथमिकता है। सबसे सरल समाधान:

(post['Caption'] = a_function_that_may_fail) rescue nil 

इस तरह की प्राथमिकता को बदलना थोड़ा गूढ़ है, हालांकि। यदि यह विफल रहता है तो nil वापस करने के लिए आप अपने a_function_that_may_fail को फिर से लिख सकते हैं, तो यह बेहतर होगा।

तुम भी nilness के लिए एक अस्थायी चर और परीक्षण इस्तेमाल कर सकते हैं:

caption = a_function_that_may_fail rescue nil 
post['Caption'] = caption unless caption.nil? 

वास्तव में एक नाबालिग अंतर यह है कि इस निर्धारित नहीं करता है post['Caption'] अगर a_function_that_may_fail एक अपवाद उठाना नहीं था लेकिन nil वापस लौटा है।

+0

(...) बचाव शून्य वह गूढ़ नहीं है, इमो। यह भी पढ़ना आसान है। –

2

सुनिश्चित करें कि आपके विधि देता है या तो nil या false बनाने

post['Caption'] = this_may_fail if this_may_fail 

या यदि आप स्थिति और असाइनमेंट के लिए विधि को दो बार कॉल करना पसंद नहीं करते हैं तो आप स्थानीय चर में this_may_fail के वापसी मूल्य को कैश कर सकते हैं।

the_value = this_may_fail 
post['Caption'] = the_value if the_value 

भी ध्यान दें कि rescue संशोधक केवल StandardError और उसके उपवर्गों फैल जाती है।

3
post.store('Caption', a_function_that_may_fail) rescue nil 
+0

प्यारा, लेकिन पोस्ट ['कैप्शन'] के बजाय लागू नहीं होगा = यह local_var = था। मैं मोल्फ के "गूढ़" समाधान को बहुत पसंद करता हूं –

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