Я искал эквивалент Array 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]]
Изменить. Для тех, кого интересует, проблема "реального мира", вызвавшая этот запрос, можно увидеть в этом ответе, где я 've использовал @fd ответ ниже для реализации.