Я искал элегантный и эффективный способ разбить строку на подстроки заданной длины в Ruby.
Пока что лучшее, что я мог придумать, это:
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?
Вы бы порекомендовали какое-нибудь лучшее решение?
редактировать
Спасибо Джереми Рутену за это элегантное и эффективное решение: [edit: НЕ эффективно!]
def chunk(string, size)
string.scan(/.{1,#{size}}/)
end
редактировать
Решение string.scan занимает около 60 секунд, чтобы нарезать 512 тыс. Кусков на 1 тыс. Кусков 10000 раз по сравнению с исходным решением на основе срезов, которое занимает всего 2,4 секунды.