Desde tan temprano como Ruby 1.8.7, la El módulo Enumerable tiene un método each_cons
que hace casi exactamente lo que usted quiere:
each_cons (n) {...} → nil
each_cons (n) → an_enumerator
Itera el bloque dado para cada matriz de consecutivos <n> elementos. Si no se proporciona ningún bloque, devuelve un enumerador.
ej .:
(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]
El único problema es que no se repita el último elemento. Pero eso es trivial de arreglar. En concreto, desea
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
Pero también se puede hacer esto:
range = 1..5
result = range.each_cons(2).reduce(:+).reduce(:+) + range.end
p result # => 29
Alternativamente, es posible que los siguientes son más legible:
result = range.end + range.each_cons(2)
.reduce(:+)
.reduce(:+)
'while' FTW ... – texasbruce