2009-02-10 20 views
125

मैं के लिए-प्रत्येक एक का उपयोग करना चाहते हैं और एक काउंटर:स्वचालित काउंटर?

i=0 
for blah in blahs 
    puts i.to_s + " " + blah 
    i+=1 
end 

वहाँ यह करने के लिए एक बेहतर तरीका है?

नोट: मैं अगर blahs किसी सरणी या एक हैश है पता नहीं है, लेकिन ऐसा करने के लिए blahs[i] यह बहुत sexier नहीं होगा रही है। इसके अलावा मैं जानना चाहता हूं कि रूबी में i++ कैसे लिखना है।


तकनीकी तौर पर, मैट और Squeegy के जवाब में पहली बार आया था, लेकिन मैं सबसे अच्छा जवाब paradoja तो इतने पर एक सा अंक के आसपास का प्रसार करने दे रही हूँ। इसके अलावा उनके जवाब में संस्करणों के बारे में नोट था, जो अभी भी प्रासंगिक है (जब तक मेरा उबंटू 8.04 रुबी 1.8.6 का उपयोग कर रहा है)।


puts "#{i} #{blah}" जो एक बहुत अधिक संक्षिप्त है का उपयोग किया है चाहिए।

+0

वहाँ रूबी में कोई वेतन वृद्धि ऑपरेटर है। आपके द्वारा लिखा गया एन + = 1 निकटतम समतुल्य है। यह एन + = 1 के लिए सिंटेक्टिक चीनी होना चाहिए, जो स्वयं n = n + 1 के लिए शॉर्टेंड है। ++ का विचार अस्वीकार कर दिया गया था क्योंकि यह इस तथ्य को छुपाता है कि आप चर को पुन: असाइन कर रहे हैं। http://rubyurl.com/Dsb1 – Chuck

+0

अच्छा! धन्यवाद चक। मुझे जावा में ++ i और i ++ सीखने के लिए मजबूर होना पड़ा, इसलिए मैंने सोचा कि यह हमेशा वहां रहेगा। –

उत्तर

183

के रूप में लोगों ने कहा है, तो आप

each_with_index 

उपयोग कर सकते हैं, लेकिन यदि आप के साथ सूचकांक चाहते एक इटरेटर "प्रत्येक" से अलग होता है (उदाहरण के लिए, यदि आप किसी इंडेक्स या उस तरह कुछ के साथ मैप करना चाहते हैं) तो आप प्रत्येक_with_index विधि के साथ एन्युमरेटर्स को जोड़ सकते हैं, या बस with_index:

blahs.each_with_index.map { |blah, index| something(blah, index)} 

blahs.map.with_index { |blah, index| something(blah, index) } 

यह कुछ है जो आप रूबी 1.8.7 और 1.9 से कर सकते हैं।

+1

यह ध्यान देने योग्य है कि यह 1.9 में नया है। –

+1

अच्छी तरह से देखा गया। दरअसल, यह 1.8.7 में भी है, लेकिन यह कुछ जोड़ने लायक है। – paradoja

+0

मैं रुबी 1.8.6 पर क्यों हूं यदि मैंने अभी उबंटू पर पूरी चीज स्थापित की है? 1.8.7 प्रयोगात्मक/बीटा है? –

10

हां, यह collection.each लूप करने के लिए है, और उसके बाद सूचकांक प्राप्त करने के लिए each_with_index है।

आपको शायद रूबी पुस्तक पढ़नी चाहिए क्योंकि यह मौलिक रूबी है और यदि आप इसे नहीं जानते हैं, तो आप बड़ी परेशानी में हैं (कोशिश करें: http://poignantguide.net/ruby/)।

रूबी स्रोत कोड से लिया:

hash = Hash.new 
%w(cat dog wombat).each_with_index {|item, index| 
    hash[item] = index 
} 
hash #=> {"cat"=>0, "wombat"=>2, "dog"=>1} 
+0

लिंक (उत्कृष्ट) और उत्तर के लिए धन्यवाद। –

+0

कोई समस्या नहीं, मदद करने में खुशी हुई। .each ब्लॉक के बारे में "मतलब" होने का मतलब नहीं था - ये मौलिक रूबी संरचनाएं हैं और उन्हें मक्खी पर सीखना वास्तव में वास्तव में दर्दनाक होगा। :) बुलेट काटने और कुछ घंटों पढ़ने के लिए सबसे अच्छा! –

+0

कोई चिंता नहीं, आपके उत्तर के लिए धन्यवाद, @ मैट। –

53
[:a, :b, :c].each_with_index do |item, i| 
    puts "index: #{i}, item: #{item}" 
end 

आप के लिए के साथ ऐसा नहीं कर सकते। मैं आमतौर पर वैसे भी प्रत्येक व्यक्ति को अधिक घोषणात्मक कॉल पसंद करता हूं। आंशिक रूप से क्योंकि जब आप वाक्यविन्यास की सीमा को हिट करते हैं तो अन्य रूपों में संक्रमण करना आसान होता है।

+0

अच्छा, मैं सिंटैक्स के साथ सीमाओं के बारे में बिंदु देखता हूं। मुझे एकाधिक पैरामीटर के साथ ब्लॉक करने के लिए उपयोग करना होगा। –

1

तो blahs एक वर्ग है कि Enumerable में घुलमिल है, तो आप ऐसा करने के लिए सक्षम होना चाहिए:

blahs.each_with_index do |blah, i| 
    puts("#{i} #{blah}") 
end 
1

enumerating enumerable श्रृंखला बहुत अच्छी है।

+0

अच्छा, उस पर धन्यवाद और एसओ पर शुभकामनाएं। –

4

i++ करने के बारे में आपके प्रश्न के अनुसार, आप रूबी में ऐसा नहीं कर सकते हैं। i += 1 कथन आपके पास बिल्कुल था कि आपको यह कैसे करना है।

+0

कूल, धन्यवाद, जो प्रश्न पर टिप्पणियों में शामिल था ... –

6

आप each_with_index के नए संस्करण की जरूरत नहीं है, तो आप तत्वों के साथ अनुक्रमित जोड़ी बनाने में zip विधि का उपयोग कर सकते हैं:

blahs = %w{one two three four five} 
puts (1..blahs.length).zip(blahs).map{|pair|'%s %s' % pair} 

जो पैदा करता है:

1 one 
2 two 
3 three 
4 four 
5 five 
+1

रुबी दस्तावेज़ों में मुझे यह कोड आपके उत्तर ''% s% s '% [1, "two"] 'से कहां मिल सकता है? ज़िप और मैपिंग के लिए एक लाइन का उपयोग करके आपकी मदद के लिए और ऊर्ध्वाधर स्थान को संरक्षित करने के लिए धन्यवाद। –

+1

इस संदर्भ में,% -ign ऑपरेटर स्ट्रिंग क्लास का एक तरीका है। आप इसके बारे में http://ruby-doc.org/core/classes/String.html#M000770 पर पढ़ सकते हैं। या आप कमांड प्रॉम्प्ट पर ri String #% टाइप कर सकते हैं। या आप इसे पहचानने वाले सभी दस्तावेज वर्गों को देखने के लिए ri% टाइप कर सकते हैं, उदाहरण के लिए, ri Fixnum #% पर अधिक परिचित अर्थ। – George

1

आप प्राप्त करना चाहते हैं प्रत्येक के लिए रूबी का सूचकांक, तो आप

.each_with_index 

का उपयोग कर सकते हैं n उदाहरण दिखाने के लिए कैसे .each_with_index काम करता है:

range = ('a'..'z').to_a 
length = range.length - 1 
range.each_with_index do |letter, index| 
    print letter + " " 
    if index == length 
     puts "You are at last item" 
    end 
end 

यह प्रिंट होगा:

a b c d e f g h i j k l m n o p q r s t u v w x y z You are at last item 
संबंधित मुद्दे