指定した個数ずつ 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 使えたらいんだけど。 とりあえず、やっつけ&力仕事で。