例
list = %w[1 茉里 2 乃莉 なずな 3 ゆの 宮子]
#=> ["1", "茉里", "2", "乃莉", "なずな", "3", "ゆの", "宮子"]
という配列がある。これを
[['1', '茉里'], ['2', '乃莉', 'なずな'], ['3', 'ゆの', '宮子']]
という様に区切りたい。
配列を区切るといえば思い浮かぶのは Enumerable#each_slice だが、このメソッドは固定の長さに区切るので、今回のように区切った後の配列の長さがまちまちなケースでは使えない。
方法
# 次の要素が整数の文字列の場合は、その手前で区切る。
list.slice_when { |_a, b| b.match?(/\d+/) }.to_a
#=> [["1", "茉里"], ["2", "乃莉", "なずな"], ["3", "ゆの", "宮子"]]
なお、亜種として Enumerable#chunk_while というメソッドも存在する。slice_when は区切る条件を指定し、chunk_while は同じグループにする条件を指定するイメージだ。