Используйте Enumerable#each_cons
. Ниже приведена копия с ruby1.8.7 rdoc . Должен работать на ruby 1.8.7.
- each_cons (n) {...}
- each_cons (п)
Повторяет данный блок для каждого массива последовательных элементов. Если блок не указан, возвращает перечислитель.
С этим вы можете дать массив:
['a', 'b', 'c', 'd', 'e'].each_cons(3).to_a
# => ["a", "b", "c"], ["b", "c", "d"], ["c", "d", "e"]]
или сделайте:
['a', 'b', 'c', 'd', 'e'].each_cons(3) {|previous, current, nekst|
puts "#{previous} - #{current} - #{nekst}"
}
# => a - b - c
# => b - c - d
# => c - d - e
Если вы хотите indice,
['a', 'b', 'c', 'd', 'e'].each_cons(3).to_a.each_with_index {|(previous, current, nekst), i|
puts "#{i + 1}. #{previous} - #{current} - #{nekst}"
}
# => 1. a - b - c
# => 2. b - c - d
# => 3. c - d - e
Вы можете передать массив другим перечислителям, например, с помощью inject
:
['a', 'b', 'c', 'd', 'e'].each_cons(3).to_a.inject(''){|str, (previous, current, nekst)|
str << previous+current+nekst
}
# => "abcbcdcde"