2013-03-13 4 views
13

मैं हाल ही में पता चला है कि आप मामले में कुछ कोड की एक पंक्ति पर rescue उपयोग कर सकते हैं कि लाइन पर गलत हो जाता है (http://www.rubyinside.com/21-ruby-tricks-902.html टिप # 21 देखें)। मैं कुछ कोड है कि इस तरह देखने के लिए प्रयोग किया जाता है:रूबी oneline बचाव

if obj['key'] && obj['key']['key2'] && obj['key']['key2']['name'] 
    name = obj['key']['key2']['name'] 
else 
    name = '' 
end 
rescue विधि के साथ

, मेरा मानना ​​है कि मैं कुछ इस तरह कि कोड बदल सकते हैं: एक शून्य अपवाद किसी में फेंक दिया जाता है, तो

name = obj['key']['key2']['name'] rescue '' 

हैश तक पहुंचने का स्तर, इसे बचाव से पकड़ा जाना चाहिए और मुझे '' देना चाहिए, जो मैं चाहता हूं। यदि वे वांछित व्यवहार थे तो मैं nil पर नाम सेट करना भी चुन सकता था।

वहाँ ऐसा करने में किसी भी ज्ञात खतरा है? मैं पूछता हूं क्योंकि यह सच होने के लिए बहुत अच्छा लगता है। मेरे पास इतना बदसूरत कोड है कि मैं उस से छुटकारा पाने के लिए प्यार करता हूं जो पहले कोड उदाहरण जैसा दिखता है।

+0

कि विशेष रूप से उपयोग के लिए, एक इनलाइन 'बचाव सुरक्षित है * बहुत * सावधान एक विधि कॉल, जहां कुछ और शायद एक I/O त्रुटि, या डेटाबेस में जानकारी मौजूद नहीं की वजह से, एक अपवाद बढ़ा सकता है के अंत में इसे का उपयोग किया। उन स्थितियों को डीबग करना सचमुच, वास्तव में कठिन है और आपको पागल बना सकता है। –

उत्तर

11

अच्छा पढ़ता है! लेकिन यह आपके प्रदर्शन को हिट करेगा। मेरे अनुभव में rescue ट्रिगर और धीमा होने पर थोड़ा धीमा होता है जब यह नहीं होता है। सभी मामलों में if तेज है। विचार करने की दूसरी बात यह है कि अपवादों की अपेक्षा नहीं की जानी चाहिए और आप इस कोड के साथ हैं। एक हैश इतनी गहराई से नेस्टेड होने एक अच्छा गंध है कि एक रिफैक्टरिंग nede है

+0

हैश एक वेब सेवा से आती है जो गहन घोंसला जेएसओएन देता है। मुझे सभी तरह से नाइल्स की जांच करनी है क्योंकि सेवा अक्सर नेस्टेड तत्वों को छोड़ देती है। –

+0

यदि यह मामला है मैं तुम्हें एक मणि का उपयोग अपने हैश को बढ़ाने के लिए, अपने कोड अधिक पठनीय बनाने के लिए सलाह देते हैं: https://github.com/intridea/hashie। – Leito

+0

विशेष रूप से, मैश (https://github.com/intridea/hashie#mash) बहुस्तरीय परीक्षण के लिए उदाहरण देखें, यह भारतीय विदेश सेवा की तुलना में तेजी नहीं हो सकता है, लेकिन यह अपने कोड में सुधार होगा! – Leito

-1

कर्नेल :: उठाने के भी

if obj['key']['key2']['name'] 
    name = obj['key']['key2']['name'] 
else 
    raise '' 
end 
+0

आपका कोड ओपी के समान नहीं है। जाओ कि 'irb' में आज़माएं और देखें क्यों। –

+0

धन्यवाद गेविन, मुझे लगता है कि ओपी बदल रहा था और त्रुटि नहीं उठा रहा था। मैं इस और अधिक देख रहा हूँ। – aug2uag

4

में इस विशिष्ट उदाहरण देखने के लिए सार्थक हो सकता है अब रूबी के साथ 2.3 के प्राप्त किया जा सकता हो सकता है dig method

name = obj.dig 'key', 'key2', 'name' 

यह सुरक्षित रूप से obj['key']['key2']['name'] का उपयोग करेंगे, शून्य लौटने यदि कोई कदम विफल रहता है।

(सामान्य में, यह आमतौर पर केवल असली, अप्रत्याशित, त्रुटियों के लिए अपवाद का उपयोग करने, सलाह भी देते है, हालांकि यह इस तरह एक उदाहरण में समझा जा सकता है वाक्य रचना यह बोझिल बना देता है।)

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