Ho cercato un modo elegante ed efficiente per suddividere una stringa in sottostringhe di una determinata lunghezza in Ruby.
Finora, il meglio che sono riuscito a trovare è questo:
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)
=> []
Potresti voler chunk("", n)
tornare [""]
invece di []
. In tal caso, aggiungilo come prima riga del metodo:
return [""] if string.empty?
Consiglieresti una soluzione migliore?
modificare
Grazie a Jeremy Ruten per questa soluzione elegante ed efficiente: [modifica: NON efficiente!]
def chunk(string, size)
string.scan(/.{1,#{size}}/)
end
modificare
La soluzione string.scan impiega circa 60 secondi per tagliare 512k in blocchi da 1k 10000 volte, rispetto alla soluzione originale basata su slice che richiede solo 2,4 secondi.