我在寻找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的答案进行实现。
self
是一个Array
。你可以将该方法提升到Enumerable
中,因为你只依赖于self
响应inject
。 (顺便说一句,这也允许你在两个测试用例中摆脱to_a
。) - Jörg W Mittag