Я немного попробовал сыграть в гольф, но это не единственный метод:
(1..9).chunk{|i|i%3==0}.reject{|sep,ans| sep}.map{|sep,ans| ans}
Или быстрее:
(1..9).chunk{|i|i%3==0 || nil}.map{|sep,ans| sep&&ans}.compact
Кроме того, Enumerable#chunk
похоже на Ruby 1.9+,но это очень близко к тому, что вы хотите.
Например, необработанный вывод будет выглядеть следующим образом:
(1..9).chunk{ |i|i%3==0 }.to_a
=> [[false, [1, 2]], [true, [3]], [false, [4, 5]], [true, [6]], [false, [7, 8]], [true, [9]]]
(to_a
- это сделать irb напечатать что-то приятное, поскольку chunk
дает вам перечислитель, а не массив)
Редактировать : обратите внимание, что вышеупомянутые элегантные решения в 2-3 раза медленнее, чем самая быстрая реализация:
module Enumerable
def split_by
result = [a=[]]
each{ |o| yield(o) ? (result << a=[]) : (a << o) }
result.pop if a.empty?
result
end
end