Tenho procurado uma maneira elegante e eficiente de dividir uma string em substrings de um determinado comprimento em Ruby.
Até agora, o melhor que consegui sugerir é o seguinte:
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)
=> []
Você pode querer chunk("", n)
retornar em [""]
vez de []
. Nesse caso, basta adicionar isso como a primeira linha do método:
return [""] if string.empty?
Você recomendaria alguma solução melhor?
Editar
Obrigado a Jeremy Ruten por esta solução elegante e eficiente: [editar: NÃO eficiente!]
def chunk(string, size)
string.scan(/.{1,#{size}}/)
end
Editar
A solução string.scan leva cerca de 60 segundos para dividir 512k em blocos de 1k 10.000 vezes, em comparação com a solução baseada em fatias original, que leva apenas 2,4 segundos.