From: Alder Green Date: 2006-05-12T00:10:04+09:00 Subject: Re: each with arguments On 5/11/06, Mike Stok wrote: > > On 11-May-06, at 10:53 AM, Charles Churchill wrote: > > > I've found myself writing the following code to address needs I have > > processing formatted text files, but is this possible some other and I > > am going through foolish gyrations here... > > > > Here is the code: > > > > class Array > > alias :orig_each :each > > def each(cnt = 1, &blk) > > if cnt == 1 > > orig_each { |x| blk.call(x) } > > else > > 0.step(self.size - 1,cnt) do |i| > > yield(self.slice(i,cnt)) > > end > > end > > end > > end > > > > so I can do things like this > > > > arr = [ key, value, value, key, value, value, key, value, value, ... ] > > arr.each(3) do |key,val1,val2| > > #manipulate them as I see fit > > end > > > > Thanks for any help you can give! > > Have you looked at Enumerable#each_slice which is included in Array? > > ratdog:~ mike$ ri Enumerable#each_slice > -------------------------------------------------- Enumerable#each_slice > e.each_slice(n) {...} > ------------------------------------------------------------------------ > Iterates the given block for each slice of elements. > > e.g.: > > (1..10).each_slice(3) {|a| p a} > # outputs below > [1, 2, 3] > [4, 5, 6] > [7, 8, 9] > [10] > > Mike > > -- > > Mike Stok > http://www.stok.ca/~mike/ > > The "`Stok' disclaimers" apply. > > each_slice doesn't wfm if I don't require 'enumerator' first: irb(main):001:0> (1..10).each_slice(3) {|a| p a} (1..10).each_slice(3) {|a| p a} NoMethodError: undefined method `each_slice' for 1..10:Range from (irb):1 irb(main):002:0> require 'enumerator' require 'enumerator' true irb(main):003:0> (1..10).each_slice(3) {|a| p a} (1..10).each_slice(3) {|a| p a} [1, 2, 3] [4, 5, 6] [7, 8, 9] [10] nil