मैं एक रेक कार्य से जल्दी कैसे लौटूं?


226

मेरे पास एक रेक कार्य है जहां मैं शुरुआत में कुछ चेक करता हूं, अगर चेक में से एक विफल हो जाता है तो मैं रेक कार्य से जल्दी लौटना चाहूंगा, मैं शेष कोड में से कोई भी निष्पादित नहीं करना चाहता।

मैंने सोचा था कि समाधान एक वापसी के लिए होगा जहां मैं कोड से लौटना चाहता था लेकिन मुझे निम्नलिखित त्रुटि मिलती है

unexpected return

जवाबों:


285

एक रेक कार्य मूल रूप से एक ब्लॉक है। लैम्ब्डा को छोड़कर एक ब्लॉक, रिटर्न का समर्थन नहीं करता है, लेकिन आप अगले स्टेटमेंट को छोड़ सकते हैं, nextजिसमें रेक कार्य में एक विधि में रिटर्न का उपयोग करने का समान प्रभाव होता है।

task :foo do
  puts "printed"
  next
  puts "never printed"
end

या आप एक विधि में कोड को स्थानांतरित कर सकते हैं और विधि में रिटर्न का उपयोग कर सकते हैं।

task :foo do
  do_something
end

def do_something
  puts "startd"
  return
  puts "end"
end

मुझे दूसरी पसंद पसंद है।


18
मुझे दूसरा सबसे अच्छा भी पसंद है। जितना अधिक मैं रेक का उपयोग करता हूं, उतना ही मैं कार्य परिभाषा के बाहर गैर-तुच्छ कोड रखना पसंद करता हूं। 100% दृढ़ नियम नहीं है, लेकिन यह काम करने के लिए एक अच्छा दिशानिर्देश है।
माइक वुडहाउस

6
मैंने कोशिश की है breakऔर मुझे यह त्रुटि मिली है: रेक निरस्त! प्रॉप-क्लोजर से ब्रेक (देखें - ट्रेस के साथ रनिंग टास्क द्वारा पूरा ट्रेस)
पुतला

4
मैं अगला उपयोग करना पसंद करता हूं। शुरुआती रिटर्न का समर्थन करने के लिए हमें एक नया तरीका क्यों घोषित करना चाहिए?
डेरेक ग्रीर

5
यदि आप कई ब्लॉकों में गहराई से बसे हैं, तो आप क्या करते हैं? ( nextकेवल काम करता है अगर वहाँ से बाहर तोड़ने के लिए ब्लॉक के "स्तर" पर है।
एमजे

3
चेतावनी: रेक कार्यों में तरीकों की घोषणा करना एक बुरा विचार है क्योंकि वे सभी लोड किए गए रेक कार्यों के लिए वैश्विक हैं, नाम स्थान के अप्रासंगिक हैं। अगले का उपयोग ब्रेक के बजाय किया जाता है क्योंकि ब्लॉक में कोड को कई बार कॉल किया जा सकता है जो ब्लॉक को निष्पादित कर रहा है (विचार विधि के बारे में)।
लेस्ली विलजेन

181

आप abort(message)एक संदेश के साथ उस कार्य को समाप्त करने के लिए कार्य के अंदर से उपयोग कर सकते हैं ।



10
यह तरीका गैर-सफलता स्थितियों में बाहर निकलने के लिए बेहतर है क्योंकि यह स्वचालित रूप से निकास की स्थिति निर्धारित करता है।
Samuil

यह एक विजेता है। तर्क त्रुटियों के लिए उपयोग प्रतिक्रिया प्रदान करने का एक आसान तरीका भी है।
डेविड हेम्पी

इनलाइन और बहुत अधिक व्याख्यात्मक से next। इसे प्यार करना।
SomeSchmo

22

मैं abortउदाहरण के लिए ऐसी स्थितियों में बेहतर विकल्प का उपयोग करता हूं :

task :foo do
  something = false
  abort 'Failed to proceed' unless something
end

1
लेकिन आप abortबिना 1एग्जिट कोड के बाहर कैसे आएंगे ? सफलता या विफलता का निर्धारण करने के लिए कमांड लाइन में रेक कार्यों का अक्सर उपयोग किया जाता है। क्या कोई "सफल" है abort?
यहोशू पिंटर

2
मेरे अपने प्रश्नों का उत्तर दिया: ऐसा लगता है कि exitसफलतापूर्वक बाहर निकलने का एक अच्छा तरीका है।
यहोशू पिंटर

19

त्रुटि ❌ के साथ लौटें

यदि आप एक त्रुटि (यानी एक निकास कोड ) के साथ लौट रहे 1हैं abort, जिसका आप उपयोग करना चाहते हैं , जो एक वैकल्पिक स्ट्रिंग परम भी लेता है जो बाहर निकलने के लिए आउटपुट होगा:

task :check do

  # If any of your checks fail, you can exit early like this.
  abort( "One of the checks has failed!" ) if check_failed?

end

कमांड लाइन पर:

$ rake check && echo "All good"
#=> One of the checks has failed!

सफलता के साथ वापसी ✅

यदि आप एक त्रुटि के बिना लौट रहे हैं (यानी एक निकास कोड 0) exitजिसका आप उपयोग करना चाहते हैं , जो एक स्ट्रिंग परम नहीं लेता है।

task :check do

  # If any of your checks fail, you can exit early like this.
  exit if check_failed?

end

कमांड लाइन पर:

$ rake check && echo "All good"
#=> All good

यह महत्वपूर्ण है यदि आप इसे क्रॉन जॉब में उपयोग कर रहे हैं या कुछ ऐसा है जिसे रेक कार्य सफल था या नहीं इसके आधार पर बाद में कुछ करने की आवश्यकता है।



8

यदि आप "रेक गर्भपात!" संदेश मुद्रित किया जाना है, तो आप "गर्भपात" या "निकास" का उपयोग कर सकते हैं। लेकिन "गर्भपात", जब बचाव खंड में उपयोग किया जाता है, तो कार्य को समाप्त करने के साथ-साथ पूरी त्रुटि को प्रिंट करता है (यहां तक ​​कि - उपयोग करने के बिना)। तो "बाहर निकलें" जो मैं उपयोग करता हूं।


3
सामान्य तौर पर, मुझे लगता है कि रिटर्न / ब्रेक के बजाय "एग्जिट" का उपयोग करना एक बुरा विचार है क्योंकि यह वर्तमान खरीद / विधि / आदि से बाहर नहीं निकलता है । - यह पूरी प्रक्रिया से बाहर निकल जाता है और किसी भी कोड को छोड़ देता है जिसे कॉलर विधि को बाद में चलाने का इरादा हो सकता है (संभवतः कुछ सफाई भी शामिल है)। लेकिन एक कठिन काम के लिए मुझे लगता है कि यह शायद कोई समस्या नहीं है ...
टायलर रिक

0

मैंने nextसिमोन कार्लेटी द्वारा सुझाए गए दृष्टिकोण का उपयोग किया , जब से रेक कार्य का परीक्षण किया abort, जो वास्तव में सिर्फ एक आवरण हैexit , वांछित व्यवहार नहीं है।

उदाहरण:

task auto_invoice: :environment do
  if Application.feature_disabled?(:auto_invoice)
    $stderr.puts 'Feature is disabled, aborting.'
  next
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.