2011-04-15 22 views
5

संभव डुप्लिकेट:
for vs each in Rubyरूबी: लूप और प्रत्येक लूप के बीच क्या अंतर है?

कहते हैं कि हम एक सरणी करते हैं, जैसे

sites = %w[stackoverflow stackexchange serverfault]

क्या

for x in sites do 
    puts x 
end 
के बीच का अंतर है

और

sites.each do |x| 
    puts x 
end 

?

वे मेरे लिए एक ही सटीक चीज करते हैं, और for लूप का सिंटैक्स मेरे लिए स्पष्ट है। क्या कोई अंतर है? यह किस स्थिति में एक बड़ा सौदा होगा?

+0

मैंने ऐसा कुछ करने के लिए चेक किया, लेकिन मैंने इसे नहीं देखा। – eckza

उत्तर

26

scoping के बारे में एक सूक्ष्म अंतर नहीं है, लेकिन मैं इसे अच्छी तरह से समझने के रूप में यह रूबी के महत्वपूर्ण पहलुओं में से कुछ का पता चलता है की सिफारिश करेंगे।

for एक वाक्यविन्यास निर्माण है, कुछ हद तक if के समान है। तुम जो भी for ब्लॉक में परिभाषित करते हैं, for के बाद के रूप में अच्छी तरह से परिभाषित रहेगा:

sites = %w[stackoverflow stackexchange serverfault] 
#=> ["stackoverflow", "stackexchange", "serverfault"] 

for x in sites do 
    puts x 
end 
stackoverflow 
stackexchange 
serverfault 
#=> ["stackoverflow", "stackexchange", "serverfault"] 
x 
#=> "serverfault" 

दूसरी ओर, each एक विधि जो एक ब्लॉक प्राप्त करता है। ब्लॉक नई शाब्दिक गुंजाइश का परिचय है, इसलिए जो कुछ भी चर आप इसे में पेश करते हैं, विधि पूर्ण होने के बाद वहाँ नहीं होगा:

sites.each do |y| 
    puts y 
end 
stackoverflow 
stackexchange 
serverfault 
#=> ["stackoverflow", "stackexchange", "serverfault"] 
y 
NameError: undefined local variable or method `y' for #<Object:0x855f28 @hhh="hello"> 
    from (irb):9 
    from /usr/bin/irb:12:in `<main>' 

मैं, के बारे में पूरी तरह से for भूल का उपयोग कर each enumerables traversing के लिए रूबी में मुहावरेदार है के रूप में की सिफारिश करेंगे। यह साइड इफेक्ट्स की संभावनाओं को कम करके, कार्यात्मक प्रोग्रामिंग के प्रतिमान को बेहतर तरीके से दोहराता है।

+0

ग्रेट उत्तर - बहुत स्पष्ट और पूरी तरह से स्पष्टीकरण। आपका बहुत बहुत धन्यवाद! – eckza

+0

+1 ग्रेट उत्तर। – Krule

+0

बहुत दिलचस्प है।मैंने सोचा कि वे वही हैं! :) – fl00r

8

sites.each ब्लॉक के अंदर x स्कॉप्स, जबकि for ब्लॉक के बाहर घोषित होने पर x का पुन: उपयोग करेगा। आम तौर पर each का उपयोग करना बेहतर होता है, यह कोड के बड़े निकायों पर साइड इफेक्ट्स को कम करता है।

-1

सीबीजेड उत्तर सही है। इसे दर्शाने के लिए, इस उदाहरण देखें:

ruby-1.9.2-p180 :001 > a = %w{ blah lah kah } 
=> ["blah", "lah", "kah"] 
ruby-1.9.2-p180 :002 > x = 1 
=> 1 
ruby-1.9.2-p180 :003 > for x in a do 
ruby-1.9.2-p180 :004 >  puts x 
ruby-1.9.2-p180 :005?> end 
blah 
lah 
kah 
=> ["blah", "lah", "kah"] 
ruby-1.9.2-p180 :006 > x 
=> "kah" 
ruby-1.9.2-p180 :007 > x=1 
=> 1 
ruby-1.9.2-p180 :008 > a.each do |x| 
ruby-1.9.2-p180 :009 >  puts x 
ruby-1.9.2-p180 :010?> end 
blah 
lah 
kah 
=> ["blah", "lah", "kah"] 
ruby-1.9.2-p180 :011 > x 
=> 1 
4

सीबीजेड जवाब सही लेकिन अधूरा है के बाद से वहाँ 1.8.x और 1.9.x के बीच व्यवहार में अंतर होता है:

1.9.2 आईआरबी:

ruby-1.9.2-p180 :001 > x = [1,2,3,4,5] 
=> [1, 2, 3, 4, 5] 
ruby-1.9.2-p180 :002 > y = ["a","b"] 
=> ["a", "b"] 
ruby-1.9.2-p180 :003 > x.each do |y| 
ruby-1.9.2-p180 :004 >  p y 
ruby-1.9.2-p180 :005?> end 
1 
2 
3 
4 
5 
=> [1, 2, 3, 4, 5] 
ruby-1.9.2-p180 :006 > y 
=> ["a", "b"] 

1.8.7 आईआरबी:

ree-1.8.7-2011.03 :001 > x = [1,2,3,4,5] 
=> [1, 2, 3, 4, 5] 
ree-1.8.7-2011.03 :002 > y = ["a","b"] 
=> ["a", "b"] 
ree-1.8.7-2011.03 :003 > x.each do |y| 
ree-1.8.7-2011.03 :004 >  p y 
ree-1.8.7-2011.03 :005?> end 
1 
2 
3 
4 
5 
=> [1, 2, 3, 4, 5] 
ree-1.8.7-2011.03 :006 > y 
=> 5 
+0

स्पष्टीकरण के लिए धन्यवाद। इसके लायक होने के लिए, मैं 1.9.2 का उपयोग कर रहा हूं। – eckza

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