在Ruby中将string切分成给定长度的最佳方法是什么?

我一直在寻找一种优雅而有效的方式来将string分块成Ruby中给定长度的子string。

到目前为止,我能想到的最好的是:

def chunk(string, size) (0..(string.length-1)/size).map{|i|string[i*size,size]} end >> chunk("abcdef",3) => ["abc", "def"] >> chunk("abcde",3) => ["abc", "de"] >> chunk("abc",3) => ["abc"] >> chunk("ab",3) => ["ab"] >> chunk("",3) => [] 

您可能希望chunk("", n)返回[""]而不是[] 。 如果是这样,只需添加这个方法的第一行:

 return [""] if string.empty? 

你会推荐更好的解决scheme吗?

编辑

感谢Jeremy Ruten提供的优雅高效解决scheme:

 def chunk(string, size) string.scan(/.{1,#{size}}/) end 

使用String#scan

 >> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{4}/) => ["abcd", "efgh", "ijkl", "mnop", "qrst", "uvwx"] >> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{1,4}/) => ["abcd", "efgh", "ijkl", "mnop", "qrst", "uvwx", "yz"] >> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{1,3}/) => ["abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz"] 

这是另一种方式来做到这一点:

 "abcdefghijklmnopqrstuvwxyz".chars.to_a.each_slice(3).to_a.map {|s| s.to_s } 

=> [“abc”,“def”,“ghi”,“jkl”,“mno”,“pqr”,“stu”,“vwx”,“yz”]

如果您知道您的string是块大小的倍数,我认为这是最有效的解决scheme

 def chunk(string, size) (string.length / size).times.collect { |i| string[i * size, size] } end 

和零件

 def parts(string, count) size = string.length / count count.times.collect { |i| string[i * size, size] } end 
 test.split(/(...)/).reject {|v| v.empty?} 

拒绝是必要的,因为它包含了组之间的空白区域。 我的正则expression式不是很高兴看到如何解决这个问题。

你有什么其他的限制吗? 否则,我会非常想做一些简单的事情

 [0..10].each { str[(i*w),w] }