指定した個数ずつ each

必要だったので作った。

#!/usr/bin/env ruby

class Array
   alias :orig_each :each
   def each(n=nil, &block)
      if n.nil? or !n.kind_of? Integer or n < 1
         self.orig_each &block
      else
         ary = []
         self.each do |e|
            ary << e
            if ary.size >= n
               block.call ary
               ary = []
            end
         end
         unless ary.empty?
            while ary.size < n
               ary << nil
            end
            block.call ary
         end
      end
      self
   end
end


if __FILE__ == $0
   ary = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

   puts "standard each:"
   ary.each do |e|
      p e
   end

   puts "5 each:"
   ary.each(5) do |e|
      p e
   end

   puts "3 each:"
   ary.each(3) do |e|
      p e
   end
end

結果:

standard each:
0
1
2
3
4
5
6
7
8
9
5 each:
[0, 1, 2, 3, 4]
[5, 6, 7, 8, 9]
3 each:
[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9, nil, nil]

ありそうなんだけど見つけられなかった。リファレンスマニュアルの each の項には #every はあるんだけど。


Enumerable#inject とか使えばもうちょっと綺麗に書けるかな? nil 埋めするとことか Array#fill 使えたらいんだけど。 とりあえず、やっつけ&力仕事で。