Ruby Core で配列に相当するものを探していたのですString#split
が、存在しないことに驚きました。値に基づいて配列をサブ配列に分割する、次よりもエレガントな方法はありますか?
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]]
編集: 興味のある方は、このリクエストのきっかけとなった「現実世界」の問題を以下で見ることができます。この答えここでは、実装に以下の @fd の回答を使用しました。
ベストアンサー1
時々パーティションこのようなことを行うには良い方法です:
(1..6).partition { |v| v.even? }
#=> [[2, 4, 6], [1, 3, 5]]