He estado buscando una forma elegante y eficiente de fragmentar una cadena en subcadenas de una longitud determinada en Ruby.
Hasta ahora, lo mejor que se me ocurrió es esto:
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)
=> []
Es posible que desee chunk("", n)
regresar en [""]
lugar de []
. Si es así, simplemente agregue esto como la primera línea del método:
return [""] if string.empty?
¿Recomendarías alguna solución mejor?
Editar
Gracias a Jeremy Ruten por esta elegante y eficiente solución: [editar: ¡NO eficiente!]
def chunk(string, size)
string.scan(/.{1,#{size}}/)
end
Editar
La solución string.scan tarda unos 60 segundos en cortar 512k en 1k trozos 10000 veces, en comparación con la solución original basada en cortes, que solo tarda 2,4 segundos.