2011-10-10 16 views
11

पर अगला मान प्राप्त करें क्या मुझे प्रत्येक लूप में अगला मान मिल सकता है?ruby ​​प्रत्येक लूप

(1..5).each do |i| 
    @store = i + (next value of i) 
end 

जहां जवाब होगा ..

1 + 2 + 2 + 3 + 3 + 4 + 4 + 5 + 5 = 29

और यह भी मैं के अगले प्राप्त कर सकते हैं अगला मूल्य?

+0

'while' FTW ... – texasbruce

उत्तर

6
इस तरह

:

range = 1..5 
store = 0 

range.each_with_index do |value, i| 
    next_value = range.to_a[i+1].nil? ? 0 : range.to_a[i+1] 
    store += value + next_value 
end  

p store # => 29 

बेहतर तरीके हो सकते हैं, लेकिन यह काम करता है।

range.to_a[i+2] 
+1

यदि कोड बदल दिया गया था, तो यह कोड तोड़ देगा, जैसे '11..15': यह 119 दे देगा जब इसे 119 देना चाहिए। –

+0

अच्छा! आपके त्वरित उत्तर के लिए धन्यवाद! दूसरे विचार पर, @AndrewGrimm सही था। – jovhenni19

+0

@AndrewGrimm, आप सही हैं, मुझे इसे ठीक करने दें। – Mischa

1

एक दृष्टिकोण है कि अनुक्रमित का उपयोग नहीं होता Enumerable # जिप है:

range = 11..15 
store = 0 # This is horrible imperative programming 
range.zip(range.to_a[1..-1], range.to_a[2..-1]) do |x, y, z| 
    # nil.to_i equals 0 
    store += [x, y, z].map(&:to_i).inject(:+) 
end 
store 
10

के रूप में जल्दी Ruby 1.8.7, के रूप में से

आप इस तरह अगले मूल्य की अगली प्राप्त कर सकते हैं संख्यात्मक मॉड्यूल में एक विधि each_cons है जो लगभग वही है जो आप चाहते हैं:

each_cons (एन) {...} → शून्य
each_cons (एन) → an_enumerator

दोहराता लगातार <n> तत्वों में से प्रत्येक सरणी के लिए दिए गए ब्लॉक। यदि कोई ब्लॉक नहीं दिया जाता है, तो एक गणक देता है।

उदा .:

(1..10).each_cons(3) { |a| p a } 
# outputs below 
[1, 2, 3] 
[2, 3, 4] 
[3, 4, 5] 
[4, 5, 6] 
[5, 6, 7] 
[6, 7, 8] 
[7, 8, 9] 
[8, 9, 10] 

केवल समस्या यह है कि यह पिछले तत्व दोहराया नहीं जाता है। लेकिन यह ठीक करने के लिए तुच्छ है। विशेष रूप से, आप

store = 0 
range = 1..5 

range.each_cons(2) do |i, next_value_of_i| 
    store += i + next_value_of_i 
end 
store += range.end 

p store # => 29 

चाहते लेकिन क्या आप भी ऐसा कर सकता है:

range = 1..5 

result = range.each_cons(2).reduce(:+).reduce(:+) + range.end 

p result # => 29 

वैकल्पिक रूप से, आप और अधिक पठनीय होने के लिए निम्न हो सकते हैं:

result = range.end + range.each_cons(2) 
          .reduce(:+) 
          .reduce(:+) 
संबंधित मुद्दे