Я шукав елегантний та ефективний спосіб розділити рядок на підрядки заданої довжини в 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?
Чи не порекомендували б ви краще рішення?
Редагувати
Дякуємо Джеремі Рутену за це елегантне та ефективне рішення: [редагувати: НЕ ефективно!]
def chunk(string, size)
string.scan(/.{1,#{size}}/)
end
Редагувати
Рішенню string.scan потрібно приблизно 60 секунд, щоб розділити 512 тис. На 1 тис. Фрагментів 10000 разів, порівняно з оригінальним рішенням на основі зрізів, яке займає лише 2,4 секунди.