2012-04-08 10 views
5

एकमात्र उपयोग केस जो मैं redo के लिए सोच सकता हूं, एक सॉकेट को लिखने या डेटाबेस से पढ़ने जैसे संचालन के लिए होगा, लेकिन यदि ये एक बार विफल हो जाते हैं, तो बाद के प्रयासों में भी असफल हो जाएगा, इसलिए यह अभी भी मेरे लिए थोड़ा सा व्यर्थ लगता है और retry के लिए मैं वास्तव में किसी भी मामले के बारे में सोच नहीं सकता जहां यह उपयोगी होगा।रूबी में फिर से और पुनः प्रयास करने का उद्देश्य क्या है?

यह केवल मेरे लिए व्यर्थ प्रतीत हो सकता है क्योंकि मुझे रूबी का पता नहीं है या नहीं, लेकिन मैं एक दिन एक भयानक भाषा बनाने की इच्छा करता हूं इसलिए मैं कम से कम कुछ सबसे लोकप्रिय भाषाओं के डिजाइन के पीछे तर्क जानना चाहता हूं क्या आप वहां मौजूद हैं।

+0

आपका दावा है कि "बाद के प्रयास सबसे अधिक संभावना भी असफल हो जायेगी" अत्यधिक बहस का मुद्दा रहा है। मुझे लगता है कि यह असफल रहा है और क्यों पर निर्भर करेगा। उदाहरण के लिए, यदि आपकी डेटाबेस ऑपरेशन फ़ाइल किसी अन्य कारण से चल रही क्वेरी के कारण एक डेडलॉक था, तो बैकिंग ऑफ और रीट्रीइंग करने का कारण बिल्कुल सही काम है। –

उत्तर

8

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

असल में, हमारे पास कुछ कोड है जो Net:SFTP का उपयोग कर दूरस्थ निर्देशिका तक पहुंचता है। निर्देशिका मौजूद होना चाहिए, लेकिन कुछ असाधारण मामलों में यह अभी तक नहीं किया गया होगा। यदि यह वहां नहीं है, तो हम इसे बनाने के लिए एक बार कोशिश करना चाहते हैं। लेकिन यह जांचने के लिए नेटवर्क एक्सेस कर रहा है कि क्या निर्देशिका हर समय बहुत महंगी होगी, खासकर जब यह केवल असाधारण मामलों में है कि यह वहां नहीं होगी। तो हम यह कर इस प्रकार है: redo के लिए

tried_mkdir = false 
begin 
    # Attempt to access remote directory 
    ... 
rescue Net::SFTP::StatusException 
    raise if tried_mkdir 
    tried_mkdir = true 
    # Attempt to make the remote directory 
    ... 
    retry 
end 
6

मामले उपयोग उपयोगकर्ता इनपुट की जाँच हो सकता है:

nums = Array.new(5){[rand(1..9), rand(1..9)]} 
nums.each do |num1, num2| 
    print "What is #{num1} + #{num2}: " 
    redo unless gets.to_i == num1 + num2 
end 
संबंधित मुद्दे