Разделение массива на подмассивы на основе значения

Я искал эквивалент массива String # split в Ruby Core и был удивлен, обнаружив, что его не существовало. Есть ли более элегантный способ, чем следующий, разделить массив на подмассивы на основе значения?

class Array
  def split( split_on=nil )
    inject([[]]) do |a,v|
      a.tap{
        if block_given? ? yield(v) : v==split_on
          a << []
        else
          a.last << v
        end
      }
    end.tap{ |a| a.pop if a.last.empty? }
  end
end

p (1..9 ).to_a.split{ |i| i%3==0 },
  (1..10).to_a.split{ |i| i%3==0 }
#=> [[1, 2], [4, 5], [7, 8]]
#=> [[1, 2], [4, 5], [7, 8], [10]]

Edit : Для тех, кто заинтересован, «реальную» проблему, которая вызвала этот запрос, можно увидеть в этот ответ , где я использовал ответ @fd ниже для реализации.

20
задан Community 23 May 2017 в 12:26
поделиться