From: Florian Gross Date: 2004-03-15T02:54:39+09:00 Subject: Re: iterating with multiple values gabriele renzi schrieb: > Hi gurus and nubys, Moin! > Suppose you are dealing with an array like [1,2,3,4], and suppose ypou > want to deal, at any iteration, with 3 values.I mean something like: > > [1,2,3,4].each_3 do |pre,cur,next| > print pre,cur,next,"\n" > end > > nil,nil,1 > nil,1,2 > 1,2,3 > 2,3,4 > 3,4,nil > 4,nil,nil I've implemented this like this: module Enumerable def each_window(window) window = 0 ... window unless window.is_a? Range window_end = window.end + (window.exclude_end? ? 0 : 1) elements, pushed = [], 0 each_with_index { |item, index| elements.push(item) pushed += 1 if pushed % window_end == 0 start = [0, window.begin - window_end + pushed].max finish = [0, window_end + pushed].max yield(elements[start ... finish]) end } end end You can use it like this for your example: [1, 2, 3, 4].each_window(-2..0) { |items| p items } [1] [1, 2] [1, 2, 3] [2, 3, 4] It's a bit different from your example however. (It won't yield trailing nils.) It can also be used to iterate groups of three elements like this: [1, 2, 3, 4, 5, 6].each_window(3) { |items| p items } Or you can skip elements like this: ["foo", 1, 2, "bar", 3, 4].each_window(1..2) { |items| p items } Maybe it is at least of some use to you. Regards, Florian Gross