rubyのプログラミング問題を解いているときに、模範解答でchunkメソッドというものを見かけたので、どんなメソッドか調べてみました。
概要
chunkメソッドは、RubyのEnumerableモジュールに定義されているメソッドの一つです。このメソッドは、要素をグループ化するために使用されます。要素を特定の条件に基づいてグループ化することができ、その結果をイテレータとして利用することができます。
chunkメソッドは特に、データの連続したグループを作成したい場合や、連続した要素をまとめて処理したい場合に便利です。
使用法
chunkメソッドは、以下のように使用します。
enumerable_object.chunk { |element| block }
enumerable_objectはEnumerableモジュールをインクルードしたオブジェクトであり、elementはイテレータの各要素を表します。blockは、要素をグループ化するための条件を指定するブロックです。
動作
chunkメソッドは、イテレータの要素を順番に評価し、連続する要素が同じグループに属する場合にそれらをまとめます。ブロック内の条件に基づいてグループ化が行われ、グループごとに配列の形式で結果が返されます。
例1
整数列を連続する奇数/偶数に分ける例を見てみます。「n.even?」の値が切り替わるところで区切られているのがわかるでしょう。
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5].chunk {|n|
n.even?
}.each {|even, ary|
p [even, ary]
}
# => [false, [3, 1]]
# [true, [4]]
# [false, [1, 5, 9]]
# [true, [2, 6]]
# [false, [5, 3, 5]]
この結果は、偶数のグループと奇数のグループの配列を持つ配列となります。各要素は、条件に基づいてグループ化された値です。
chunkメソッドは、必要に応じて繰り返し処理を行います。同じグループに属する要素が連続している場合は、連続した要素をまとめたグループとして返されます。
例2
nil、 :_separator はある要素を無視したい場合に用います。以下の例では、空行の要素が無視されていることがわかります。
numbers = <<'EOS'
123
456
789
998
999
EOS
datas = numbers.split("\n")
p datas.chunk {|x| x != "" || nil}.map {|x| x.last }
# => [["123", "456"], ["789"], ["998", "999"]]
まとめ
以上が、Rubyのchunkメソッドについての説明です。このメソッドを活用することで、要素のグループ化や連続した値の処理を効果的に行うことができます。