2013-01-17 19 views
11

के लिए 1 से शुरू each_with_index_do मैं बहुत की तरह एक दृश्य पर एक गहरे लाल रंग का iterator उपयोग कर रहा हूँ एक रेल app में:सूचकांक

<% ([email protected]).each_with_index do |element, index| %> 
    ... 
<% end %> 

मैं 1 के अलावा सोचा .. बजाय सिर्फ कहने का: @document.data

को इंडेक्स को 1 से शुरू होने की चाल मिल जाएगी। लेकिन हां, उपरोक्त कोड इंडेक्स अभी भी डेटा के लिए 0 है। लम्बाई (-1 प्रभावी)। तो मैं गलत क्या कर रहा हूं, मुझे सूचकांक की आवश्यकता 1-डेटा के बराबर है। लम्बाई ... ऐसा करने के लिए इटरेटर को कैसे सेट अप करें।

+0

एक सरणी के पहले सूचकांक हमेशा 'होने की 0' जा रहा है। – Kyle

+0

सूचकांक हमेशा शून्य आधारित होगा। इससे क्या फर्क पड़ता है? –

+0

@Codejoy - कई उत्तरों द्वारा आपके प्रश्न का उत्तर देने के बाद से कुछ उत्तरों को अपवर्तित/स्वीकार करना बुद्धिमान होगा। – Kyle

उत्तर

19

each एक सरणी

[:a, :b, :c].each do |object| 
    puts object 
end 

जो आउटपुट में तत्वों से अधिक पुनरावृति जाएगा;

:a 
:b 
:c 

तत्वों से अधिक each_with_index दोहराता है, और भी सूचकांक में गुजरता (शून्य से शुरू)

[:a, :b, :c].each_with_index do |object, index| 
    puts "#{object} at index #{index}" 
end 

जो आउटपुट

:a at index 0 
:b at index 1 
:c at index 2 

यदि आप इसे फिर 1 अनुक्रमित चाहते हैं तो बस जोड़ने 1.

[:a, :b, :c].each_with_index do |object, index| 
    indexplusone = index + 1 
    puts "#{object} at index #{indexplusone}" 
end 

आउटपुट जो

:a at index 1 
:b at index 2 
:c at index 3 

यदि आप एक सरणी के एक सबसेट से अधिक पुनरावृति करना चाहते हैं, तो बस सबसेट चुनते हैं, तो पुनरावृति यह

without_first_element = array[1..-1] 

without_first_element.each do |object| 
    ... 
end 
+0

ठीक है मुझे अपने तरीकों की त्रुटि का एहसास हुआ। – Codejoy

+0

कोई चिंता नहीं @Codejoy –

2

इंडेक्स को 1 से शुरू करने जैसी कोई चीज़ नहीं है। यदि आप सरणी में पहला आइटम छोड़ना चाहते हैं तो next का उपयोग करें।

<% ([email protected]).each_with_index do |element, index| %> 
    next if index == 0 
<% end %> 
+1

ट्रिविया: पर्ल में वैश्विक चर '' है ['आप सभी सरणी सूचकांक 1 या किसी अन्य मूल्य से शुरू करने के लिए सेट कर सकते हैं। हमें बहुत प्रसन्न होना चाहिए रूबी के पास यह नहीं है। –

2

एक सरणी सूचकांक हमेशा शून्य आधारित होने जा रहा है।

आप पहला तत्व है, जो यह लग रहा है कि आप की तरह कर छोड़ करना चाहते हैं: मैं शायद लगता है कि तुम each_with_index गलत

@document.data[1..-1].each do |data| 
    ... 
end 
1

अगर मैं आपके सवाल का सही समझते हैं, आप पर सूचकांक 1 से शुरू करना चाहते हैं, लेकिन रूबी एरे में 0 बेस इंडेक्स के रूप में जाना जाता है, इसलिए सबसे आसान तरीका

दिया गया @document.data एक सरणी

है
index = 1 
@document.data.each do |element| 
    #your code 
    index += 1 
end 

HTH

+0

कभी भी सबसे अच्छी चीज नहीं है लेकिन यह काम करता है धन्यवाद – MZaragoza

42

जब तक आप 1.8 की तरह एक पुराने रूबी का उपयोग कर रहे (मैं यह 1 में जोड़ा गया लगता है।9 लेकिन मुझे यकीन नहीं कर रहा हूँ), तो आपको each.with_index(1) उपयोग कर सकते हैं एक 1-आधारित प्रगणक पाने के लिए:

आपके मामले में इसे इस तरह होगा:

<% @document.data.length.each.with_index(1) do |element, index| %> 
    ... 
<% end %> 

आशा में मदद करता है!

+3

निश्चित रूप से इन दिनों बेहतर जवाब। –

0

मुझे एक ही समस्या थी, और प्रत्येक_with_index विधि का उपयोग करके इसे हल किया गया। लेकिन कोड में इंडेक्स में 1 जोड़ा गया।

@someobject.each_with_index do |e, index| 
    = index+1 
1

उपयोग Integer#next:

[:a, :b, :c].each_with_index do |value, index| 
    puts "value: #{value} has index: #{index.next}" 
end 

पैदा करता है:

value: a has index: 1 
value: b has index: 2 
value: c has index: 3 
संबंधित मुद्दे