class Array
def in_groups_of(number, fill_with = nil, &block)
["3", "4"]
["1", "2"]
%w(1 2 3 4 5).in_groups_of(2, false) {|group| p group}
["5", " "]
["3", "4"]
["1", "2"]
%w(1 2 3 4 5).in_groups_of(2, ' ') {|group| p group}
["10", nil, nil]
["7", "8", "9"]
["4", "5", "6"]
["1", "2", "3"]
%w(1 2 3 4 5 6 7 8 9 10).in_groups_of(3) {|group| p group}
padding any remaining slots with +fill_with+ unless it is +false+.
Splits or iterates over the array in groups of size +number+,
def in_groups_of(number, fill_with = nil, &block) if number.to_i <= 0 raise ArgumentError, "Group size must be a positive integer, was #{number.inspect}" end if fill_with == false collection = self else # size % number gives how many extra we have; # subtracting from number gives how many to add; # modulo number ensures we don't add group of just fill. padding = (number - size % number) % number collection = dup.concat(Array.new(padding, fill_with)) end if block_given? collection.each_slice(number, &block) else collection.each_slice(number).to_a end end