प्रत्येक में रूबी में स्वचालित काउंटर?


134

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

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

इसे करने का कोई बेहतर तरीका है?

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


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


इस्तेमाल किया जाना चाहिए puts "#{i} #{blah}"जो एक बहुत अधिक रसीला है।


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

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

जवाबों:


190

जैसा कि लोगों ने कहा है, आप उपयोग कर सकते हैं

each_with_index

लेकिन यदि आप "प्रत्येक" के लिए एक इटेरेटर के साथ सूचकांकों को चाहते हैं (उदाहरण के लिए, यदि आप किसी इंडेक्स या कुछ इस तरह से मैप करना चाहते हैं) तो आप एन्यूमरेटर्स को प्रत्येक_विथ_इन्डेक्स विधि के साथ संक्षिप्त कर सकते हैं, या बस _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 में नया है।
ज़ैक लैंगले 20

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

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

आप कौन सा उबटन प्रयोग कर रहे हैं? निडर में 1.8.7 है। यह अंतिम स्थिर संस्करण है ( माणिक- lang.org/en/downloads )। हालाँकि, आप एक ही व्यवहार करने के लिए रूबी 1.8.6 से रूबरू हो सकते हैं ( सख्ती से देखें ।
परेडोजा

3
मैं डिस्ट्रीब्यूशन से थक गया था इसलिए मैंने उबंटू और लिनक्स मिंट पर अपनी रूबी स्थापना का प्रबंधन करने के लिए आरवीएम का उपयोग करना शुरू कर दिया।
टिन मैन

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

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


अच्छा है, मैं वाक्य रचना के लिए सीमा के बारे में बिंदु देखता हूं। मुझे कई मापदंडों के साथ ब्लॉक करने की आदत है।
दान रोसेनस्टार्क

11

हां, यह 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}

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

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"]रूबी डॉक्स में आपके जवाब से मुझे यह कोड कहां मिल सकता है ? आपकी मदद के लिए धन्यवाद और zipping और मानचित्रण के लिए एक पंक्ति का उपयोग करके ऊर्ध्वाधर स्थान के संरक्षण के लिए।
डैन रोसेनस्टार्क

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

4

जैसा कि आपके सवाल के बारे में i++, ठीक है, आप रूबी में ऐसा नहीं कर सकते। i += 1आपके पास जो कथन है वह ठीक यही है कि आप इसे कैसे करेंगे।



1

यदि blahsकोई ऐसा वर्ग है जो Enumerable में मिश्रण करता है, तो आपको ऐसा करने में सक्षम होना चाहिए:

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

1

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

.each_with_index

यह दिखाने के लिए एक उदाहरण है कि कैसे .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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.