दिलचस्प पोस्ट
बढ़ी 'के लिए' लूप के कारण एक ArrayIndexOutOfBoundsException सेमीकेक पुस्तकालयों को स्वचालित रूप से अन्य सेंमीक संकुल द्वारा सुलभ बनाना कैसे एक div तत्व करने के लिए onload घटना जोड़ने के लिए? Stdout के लिए org.w3c.dom.Document को प्रिंट करने का सबसे छोटा रास्ता क्या है? 'लूप के लिए' पायथन में स्क्रॉप करना मैं किस क्रम को बदल सकता हूं जिसमें उल्का जावास्क्रिप्ट फाइल लोड करता है? सी #: हेकर के लिए कड़ी मेहनत कैसे करें / क्रैकर के पास जाओ या लायसेंसिंग की जांच बाईपास करें? कैसे आप कांस्य 2 क्षुधा को तैनात करते हैं? php अपलोड पर छवि का आकार परिवर्तन क्या आईओएस में कस्टम स्पंदन के लिए एपीआई हैं? आईओएस 7 में नेविगेशन बार का रंग कैसे बदल सकता है? किसी भी तरह से मुख्य डेटा को पॉप्युलेट करने के लिए? दृश्य मॉडल (सी #) से WPF में पाठ बॉक्स पर फ़ोकस सेट करें ऑरेकल में पंक्तियों के लिए अल्पविराम से अलग किए गए मान कैसे परिवर्तित करें? एंड्रॉइड में ओरिएंटेशन परिवर्तन पर asynctask के साथ गतिविधि पुनः लोड करने से बचें

रूबी में "प्रत्येक" बनाम "के लिए"

रूबी में लूप के बारे में मुझे बस एक त्वरित सवाल था। क्या संग्रह के माध्यम से चलने के इन दोनों तरीकों के बीच कोई अंतर है?

# way 1 @collection.each do |item| # do whatever end # way 2 for item in @collection # do whatever end 

बस सोच रहा था कि ये बिल्कुल वैसा ही हैं या यदि कोई सूक्ष्म अंतर है (संभवतः जब @collection है)।

वेब के समाधान से एकत्रित समाधान "रूबी में "प्रत्येक" बनाम "के लिए""

यह एकमात्र अंतर है:

से प्रत्येक:

 irb> [1,2,3].each { |x| } => [1, 2, 3] irb> x NameError: undefined local variable or method `x' for main:Object from (irb):2 from :0 

के लिये:

 irb> for x in [1,2,3]; end => [1, 2, 3] irb> x => 3 

लूप के साथ, ब्लॉक के बाद इटरेटर चर अभी भी रहता है। each लूप के साथ, यह तब तक नहीं होता है, जब तक कि लूप शुरू होने से पहले इसे पहले ही स्थानीय वैरिएबल के रूप में परिभाषित नहीं किया गया था।

इसके अलावा, each पद्धति के लिए सिर्फ सिंटेक्स चीनी है।

जब @collection nil दोनों छोरों एक अपवाद फेंक देते हैं:

अपवाद: अपरिभाषित स्थानीय चर या मुख्य के लिए `@collection 'विधि: वस्तु

एक अच्छी व्याख्या के लिए " लूप की बुराई " देखें (चर scoping पर विचार करने के लिए एक छोटा अंतर है)

each का उपयोग रूबी के अधिक मुहावरेदार उपयोग माना जाता है

आपका पहला उदाहरण,

 @collection.each do |item| # do whatever end 

अधिक मुहावरेदार है जबकि रूबी के लिए looping constructs का समर्थन करता है और while , ब्लॉक सिंटैक्स आम तौर पर पसंद किया जाता है।

एक और सूक्ष्म अंतर यह है कि किसी भी वेरिएबल के लिए जो आप लूप के भीतर घोषित करते हैं for लूप के बाहर उपलब्ध होंगे, जबकि इटरेटर ब्लॉक के भीतर वाले प्रभावी रूप से निजी हैं

एक और अलग ..

 number = ["one", "two", "three"] => ["one", "two", "three"] loop1 = [] loop2 = [] number.each do |c| loop1 << Proc.new { puts c } end => ["one", "two", "three"] for c in number loop2 << Proc.new { puts c } end => ["one", "two", "three"] loop1[1].call two => nil loop2[1].call three => nil 

स्रोत: http://paulphilippov.com/articles/enumerable-each-vs-for-loops-in-ruby

अधिक स्पष्ट के लिए: http://www.ruby-forum.com/topic/179264#784884

ऐसा लगता है कि कोई अंतर नहीं है, for each नीचे का उपयोग करता है

 $ irb >> for x in nil >> puts x >> end NoMethodError: undefined method `each' for nil:NilClass from (irb):1 >> nil.each {|x| puts x} NoMethodError: undefined method `each' for nil:NilClass from (irb):4 

जैसे बायरर्ड कहते हैं, प्रत्येक अधिक मुहावरेदार है यह आपके से अधिक छुपाता है और विशेष भाषा सुविधाओं की आवश्यकता नहीं है प्रति टेलिमाकस की टिप्पणी

for .. in .. सेट लूप के दायरे से बाहर इटरेटर, तो

 for a in [1,2] puts a end 

लूप समाप्त होने के बाद a परिभाषित छोड़ देता a । जहां each नहीं है जो each का उपयोग करने के पक्ष में एक और कारण है, क्योंकि temp चर एक छोटी अवधि रहता है।

जहाँ तक मुझे पता है, इन-भाषा नियंत्रण संरचनाओं के बजाय ब्लॉक का उपयोग करना अधिक मुहावरेदार है

कभी भी इसका उपयोग करने के for बग का कारण हो सकता है

अंतर सूक्ष्म है लेकिन जबरदस्त कीड़े पैदा कर सकता है!

मूर्ख मत बनो, यह मुहावरेदार कोड या शैली के मुद्दों के बारे में नहीं है। यह उत्पादन कोड में लगभग अनचाहे बगों से बचने का मामला है रूबी के कार्यान्वयन के for एक गंभीर दोष है और इसका उपयोग नहीं किया जाना चाहिए। हमेशा each लूप का उपयोग करें for लूप के for कभी भी उपयोग नहीं करें

यहाँ एक उदाहरण है जहां एक बग का परिचय दिया गया है,

 class Library def initialize @ary = [] end def method_with_block(&block) @ary << block end def method_that_uses_these_blocks @ary.map(&:call) end end lib = Library.new for n in %w{foo bar quz} lib.method_with_block { n } end puts lib.method_that_uses_these_blocks 

प्रिंटों

 quz quz quz 

%w{foo bar quz}.each { |n| ... } का उपयोग करना %w{foo bar quz}.each { |n| ... } %w{foo bar quz}.each { |n| ... } प्रिंट

 foo bar quz 

क्यूं कर?

एक लूप के लिए चर n को एक बार और केवल और फिर परिभाषित किया जाता है कि एक परिभाषा सभी पुनरावृत्तियों के लिए उपयोग की जाती है। इसलिए प्रत्येक ब्लॉक उसी n को quz है, जिसमें लूप समाप्त होने तक quz मान होता है। बग!

each लूप में each आवृत्ति के लिए एक ताजा चर n परिभाषित किया जाता है, उदाहरण के लिए चर n से ऊपर तीन अलग-अलग बार परिभाषित किया गया है। इसलिए प्रत्येक ब्लॉक सही मूल्यों के साथ एक अलग n को दर्शाता है