ruby在每个循环上获得下一个值

jov*_*i19 12 ruby each

我可以在每个循环中获得下一个值吗?

(1..5).each do |i|
    @store = i + (next value of i)
end
Run Code Online (Sandbox Code Playgroud)

答案是......

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

我也可以获得下一个下一个值吗?

Jus*_*tin 15

Ruby 1.8.7开始,Enumerable模块的方法each_cons几乎完全符合您的要求:

each_cons(n){...}→nil
each_cons(n)→ 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]
Run Code Online (Sandbox Code Playgroud)

唯一的问题是它不会重复最后一个元素.但这很难解决.具体来说,你想要的

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
Run Code Online (Sandbox Code Playgroud)

但你也可以这样做:

range = 1..5

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

p result # => 29
Run Code Online (Sandbox Code Playgroud)

或者,您可能会发现以下内容更具可读性:

result = range.end + range.each_cons(2)
                          .reduce(:+)
                          .reduce(:+)
Run Code Online (Sandbox Code Playgroud)


Mis*_*cha 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
Run Code Online (Sandbox Code Playgroud)

可能有更好的方法,但这是有效的.

您可以像下面这样获得下一个值:

range.to_a[i+2]
Run Code Online (Sandbox Code Playgroud)