Saya telah mencari cara yang elegan dan efisien untuk memotong string menjadi substring dengan panjang tertentu di Ruby.
Sejauh ini, yang terbaik yang bisa saya dapatkan adalah ini:
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)
=> []
Anda mungkin ingin chunk("", n)
kembali, [""]
bukan []
. Jika demikian, tambahkan saja ini sebagai baris pertama dari metode ini:
return [""] if string.empty?
Apakah Anda akan merekomendasikan solusi yang lebih baik?
Sunting
Terima kasih kepada Jeremy Ruten untuk solusi yang elegan dan efisien ini: [edit: TIDAK efisien!]
def chunk(string, size)
string.scan(/.{1,#{size}}/)
end
Sunting
Solusi string.scan membutuhkan waktu sekitar 60 detik untuk memotong 512k menjadi 1k potongan 10000 kali, dibandingkan dengan solusi berbasis slice asli yang hanya membutuhkan 2,4 detik.