【发布时间】:2011-06-15 13:55:27
【问题描述】:
我在 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]]
编辑:对于那些感兴趣的人,引发此请求的“现实世界”问题可以在this answer 中看到,我在下面使用@fd 的答案来实现。
【问题讨论】:
-
嗯,在 Python 中,您可以将其转换为字符串(以逗号或其他内容分隔的值),将其拆分,然后返回列表。不知道这是否是 Ruby 中的一个选项。
-
@Rafe 会的,但前提是内容只是字符串。即便如此,这也很难被认为是优雅的。 :p
-
@Phrogz 如果它们是数字,它也可以正常工作。您只需执行
','.join([str(x) for x in list_of_nums]),然后拆分任何内容,然后重新加入并以逗号拆分。实用,是的,优雅的,嗯,不。 -
@Rafe 也许我也应该接受大多数迂回黑客的答案。到/从 YAML,有人吗? :)
-
仅供参考:我在您的解决方案中看不到任何需要
self成为Array的内容。您可以将该方法拉入Enumerable,因为您只依赖self响应inject。 (顺便说一句,这也可以让您摆脱两个测试用例中的to_a。)