Subscribed unsubscribe Subscribe Subscribe

Enumerable#each_chunk

Enumerableなオブジェクトを条件に従ってチャンクに切り分ける。メモ。

module Enumerable
  def each_chunk(chunker)
    chunk = []
    self.each {|item|
      if chunker.call(item)
        yield chunk.push(item)
        chunk = []
      else
        chunk.push(item)
      end
    }
    yield chunk
  end
end

if __FILE__ == $0 then
  require 'pp'
  chunker = lambda {|x| x % 3 == 0 }
  (0..20).each_chunk(chunker) {|chunk|
    pp chunk
  }
end

chunkerを実行して真になるとチャンクに切り分ける。実行例。

$ ruby enumerable/chunk.rb
[0]
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10, 11, 12]
[13, 14, 15]
[16, 17, 18]
[19, 20]

便利なこともあるかもしれない。