This blog is part of our Ruby 2.4 series.
Enumerable#chunk method can be used on enumerator object to group consecutive items based on the value returned from the block passed to it.
[1, 4, 7, 10, 2, 6, 15].chunk { |item| item > 5 }.each { |values| p values }
=> [false, [1, 4]]
[true, [7, 10]]
[false, [2]]
[true, [6, 15]]
Prior to Ruby 2.4, passing a block to chunk method was must.
array = [1,2,3,4,5,6]
array.chunk
=> ArgumentError: no block given
In Ruby 2.4, we will be able to use chunk without passing block. It just returns the enumerator object which we can use to chain further operations.
array = [1,2,3,4,5,6]
array.chunk
=> <Enumerator: [1, 2, 3, 4, 5, 6]:chunk>
Let's take the case of listing consecutive integers in an array of ranges.
# Before Ruby 2.4
integers = [1,2,4,5,6,7,9,13]
integers.enum_for(:chunk).with_index { |x, idx| x - idx }.map do |diff, group|
[group.first, group.last]
end
=> [[1,2],[4,7],[9,9],[13,13]]
We had to use
enum_for here as
chunk can't be called without block.
enum_for creates a new enumerator object which will enumerate by calling the
method passed to it. In this case the method passed was chunk.
With Ruby 2.4, we can use chunk method directly without using enum_for as it
does not require a block to be passed.
# Ruby 2.4
integers = [1,2,4,5,6,7,9,13]
integers.chunk.with_index { |x, idx| x - idx }.map do |diff, group|
[group.first, group.last]
end
=> [[1,2],[4,7],[9,9],[13,13]]

Related blogs
- 01Ruby 2.4 has optimized enumerable min max methodsSeptember 28, 2017 · Chirag Shah
- 02CSV::Row#each etc. return enumerator when no block givenSeptember 25, 2017 · Sushant Mittal
- 03Ruby 2.4 DateTime#to_time & Time#to_time keeps infoSeptember 19, 2017 · Sushant Mittal
- 04Avoid exception for dup on IntegerAugust 1, 2017 · Rohit Arolkar