दिलचस्प पोस्ट
अगर कोई सरणी में एक निश्चित मान है, तो मैं कैसे परीक्षण कर सकता हूं? तीन। जेएस कैमरा ऊपर या नीचे झुकता है और क्षितिज का स्तर रखता है \ B और \ r का उपयोग सी में मैं जावास्क्रिप्ट में एक गतिशील रूप से नामित विधि कैसे कॉल करूं? गतिशील रूप से स्प्रिंग डेटा स्रोत परिवर्तित करें टीम प्रोजेक्ट्स के अंतर्गत टीएफएस 2010 शाखा – सर्वश्रेष्ठ व्यवहार जावा इंटरफेस? छवि तुलना – तेज एल्गोरिथ्म दो चयन कथन के परिणाम शामिल हों I कैसे angularjs में एक http मिल सेवा कैश करने के लिए मैं एक ही प्रकार के दो हॅशमार्क ऑब्जेक्ट्स को कैसे जोड़ सकता हूं? एक्स घंटे से पुराने फ़ाइलों को कैसे हटाएं कुशलतापूर्वक MySQLDB SScursor का उपयोग कैसे करें? सी # 4 समर्थन एक्सटेंशन विधियों में गतिशील कीवर्ड क्या होगा? पीडीबी फ़ाइल क्या है?

रूबी ब्लॉक से कैसे बाहर निकलना है?

यहां Bar#do_things :

 class Bar def do_things Foo.some_method(x) do |x| y = x.do_something return y_is_bad if y.bad? # how do i tell it to stop and return do_things? y.do_something_else end keep_doing_more_things end end 

और यहां Foo#some_method :

 class Foo def self.some_method(targets, &block) targets.each do |target| begin r = yield(target) rescue failed << target end end end end 

मैंने उठाने का उपयोग करने के बारे में सोचा, लेकिन मैं इसे सामान्य बनाने की कोशिश कर रहा हूं, इसलिए मैं Foo में कोई भी विशिष्ट नहीं रखना चाहता।

Solutions Collecting From Web of "रूबी ब्लॉक से कैसे बाहर निकलना है?"

next कीवर्ड का उपयोग करें यदि आप अगले आइटम पर जारी रखना नहीं चाहते हैं, तो break उपयोग करें

जब एक ब्लॉक के भीतर next का उपयोग किया जाता है, तो यह ब्लॉक को तत्काल से बाहर निकलने का कारण बनता है, आईटरेटर पद्धति पर नियंत्रण लौटाता है, जो तब फिर से ब्लॉक को चालू करके एक नया चलना शुरू कर सकता है:

 f.each do |line| # Iterate over the lines in file f next if line[0,1] == "#" # If this line is a comment, go to the next puts eval(line) end 

जब एक ब्लॉक में इस्तेमाल किया जाता है, ब्लॉक से बाहर break नियंत्रण, इटरेटर से बाहर आने वाला है, जो ब्लॉक को लागू करता है, और इटरेटर के आवागमन के बाद पहली अभिव्यक्ति के लिए:

 f.each do |line| # Iterate over the lines in file f break if line == "quit\n" # If this break statement is executed... puts eval(line) end puts "Good bye" # ...then control is transferred here 

और अंत में, एक ब्लॉक में return का उपयोग:

return हमेशा return करने के लिए संलग्न विधि का कारण बनता है, भले ही उसे ब्लॉकों के भीतर गहराई से कैसे घिरा होता है (लम्ब्दास के मामले में छोड़कर):

 def find(array, target) array.each_with_index do |element,index| return index if (element == target) # return from find end nil # If we didn't find the element, return nil end 

मैं सिर्फ एक ब्लॉक से बाहर तोड़ने में सक्षम होना चाहता था – एक तरह की तरह आगे की तरह, वास्तव में एक लूप से संबंधित नहीं है वास्तव में, मैं लूप को समाप्त किए बिना एक लूप में से एक खंड को तोड़ना चाहता हूं। ऐसा करने के लिए, मैंने ब्लॉक को एक-आवर्ती लूप बनाया:

 for b in 1..2 do puts b begin puts 'want this to run' break puts 'but not this' end while false puts 'also want this to run' end 

उम्मीद है कि यह अगले गुगलर में मदद करता है जो यहां पर आधारित विषय पंक्ति पर आधारित है।

यदि आप अपने ब्लॉकों को एक उपयोगी मान वापस करना चाहते हैं (उदाहरण के लिए #map , #inject , आदि का उपयोग करते समय), तो next और break भी तर्क स्वीकार करें।

निम्नलिखित को धयान मे रखते हुए:

 def contrived_example(numbers) numbers.inject(0) do |count, x| if x % 3 == 0 count + 2 elsif x.odd? count + 1 else count end end end 

next समकक्ष:

 def contrived_example(numbers) numbers.inject(0) do |count, x| next count if x.even? next (count + 2) if x % 3 == 0 count + 1 end end 

बेशक, आप हमेशा एक विधि में आवश्यक तर्क को निकाल सकते हैं और अपने ब्लॉक के अंदर से कॉल कर सकते हैं:

 def contrived_example(numbers) numbers.inject(0) { |count, x| count + extracted_logic(x) } end def extracted_logic(x) return 0 if x.even? return 2 if x % 3 == 0 1 end 

बदले की बजाय खोजशब्द का उपयोग करें

संभवतः आप each targets की बजाय each हाथों के बजाय किसी अर्रे में विशेष आइटम ढूंढने के लिए अंतर्निहित तरीकों का उपयोग कर सकते हैं। कुछ उदाहरण:

 class Array def first_frog detect {|i| i =~ /frog/ } end def last_frog select {|i| i =~ /frog/ }.last end end p ["dog", "cat", "godzilla", "dogfrog", "woot", "catfrog"].first_frog # => "dogfrog" p ["hats", "coats"].first_frog # => nil p ["houses", "frogcars", "bottles", "superfrogs"].last_frog # => "superfrogs" 

एक उदाहरण ऐसा कुछ कर रहा होगा:

 class Bar def do_things Foo.some_method(x) do |i| # only valid `targets` here, yay. end end end class Foo def self.failed @failed ||= [] end def self.some_method(targets, &block) targets.reject {|t| t.do_something.bad? }.each(&block) end end 

next और break इस सरल उदाहरण में सही काम करने लगते हैं!

 class Bar def self.do_things Foo.some_method(1..10) do |x| next if x == 2 break if x == 9 print "#{x} " end end end class Foo def self.some_method(targets, &block) targets.each do |target| begin r = yield(target) rescue => x puts "rescue #{x}" end end end end Bar.do_things 

आउटपुट: 1 3 4 5 6 7 8

लूप को तोड़ने के लिए या पाश के बाहर निकलने के लिए बस का उपयोग करें वापसी next कीवर्ड अगर return.nil तत्व? next if element.nil?