概要
ある配列を任意の長さ n ずつ分解したいです。
例えば、
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
を
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]]
にしたいということです。
簡単にできるんです。そう Enumerable#each_slice ならね。
array = (0..10).to_a
#=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
array.each_slice(3).to_a
#=> [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]]
Enumerable#each_slice
メソッドは Enumerator
オブジェクトを返すので、
to_a
で Array に変換して完成です
追記
Active Support コア拡張機能 の Array#in_groups_of でも同様のことができました。
$ gem install activesupport
require 'active_support/core_ext/array/grouping'
array = (0..10).to_a
#=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 第 1 引数のみの場合、余りが nil で埋められる。
array.in_groups_of(3)
#=> [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, nil]]
# 第 2 引数に false を指定した場合、
# 前述の Enumerable#each_slice を使用した方法と同じ結果になる。
array.in_groups_of(3, false)
#=> [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]]