我可以在每個循環中獲取下一個值嗎?ruby在每個循環中獲取下一個值
(1..5).each do |i|
@store = i + (next value of i)
end
其中答案是..
1 + 2 + 2 + 3 + 3 + 4 + 4 + 5 + 5 = 29
我還可以得到下一個的下一個值?
我可以在每個循環中獲取下一個值嗎?ruby在每個循環中獲取下一個值
(1..5).each do |i|
@store = i + (next value of i)
end
其中答案是..
1 + 2 + 2 + 3 + 3 + 4 + 4 + 5 + 5 = 29
我還可以得到下一個的下一個值?
像這樣:
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]
如果範圍發生了變化,這段代碼就會中斷,比如「11..15」:當它給出119時,它會給出65. –
很好!感謝您的快速回復!再次想到@AndrewGrimm是對的。 – jovhenni19
@AndrewGrimm,你說得對,讓我解決它。 – Mischa
一種方法是可枚舉#郵編:
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
從早Ruby 1.8.7時,枚舉模塊有一個方法each_cons
,它幾乎完全符合您的要求:
個each_cons(N){...}→零個
each_cons(N)→an_enumerator迭代連續<Ñ>元件的每個陣列的給定的塊。如果沒有給出塊,則返回一個枚舉器。
例如爲:
(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(:+)
'while' FTW ... 。 – texasbruce