Fin dal Ruby 1.8.7, il Il modulo enumerabile ha avuto un metodo each_cons
che fa quasi esattamente quello che vuoi:
each_cons (n) {...} → nil
each_cons (n) → an_enumerator
Itera il blocco specificato per ciascuna serie di consecutivi <n> elementi. Se non viene fornito alcun blocco, restituisce un enumeratore.
es .:
(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]
L'unico problema è che non ripete l'ultimo elemento. Ma è banale da sistemare. In particolare, si vuole
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
Ma si potrebbe anche fare questo:
range = 1..5
result = range.each_cons(2).reduce(:+).reduce(:+) + range.end
p result # => 29
In alternativa, si può trovare il seguente per essere più leggibile:
result = range.end + range.each_cons(2)
.reduce(:+)
.reduce(:+)
'while' FTW ... – texasbruce