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?
より良い解決策をお勧めしますか?
編集
このエレガントで効率的なソリューションを提供してくれた Jeremy Ruten に感謝します: [編集: 効率的ではありません!]
def chunk(string, size)
string.scan(/.{1,#{size}}/)
end
編集
string.scan ソリューションでは、512k を 1k チャンクに 10000 回切り刻むのに約 60 秒かかりますが、元のスライスベースのソリューションでは 2.4 秒しかかかりません。