Di Ruby, bagaimana cara menghasilkan string teks berulang yang panjang?

139

Apa cara terbaik untuk menghasilkan string panjang dengan cepat di ruby? Ini berfungsi, tetapi sangat lambat:

str = ""
length = 100000
(1..length).each {|i| str += "0"}

Saya juga memperhatikan bahwa membuat string dengan panjang yang layak dan kemudian menambahkannya ke string yang ada hingga panjang yang diinginkan bekerja lebih cepat:

str = ""
incrementor = ""
length = 100000
(1..1000).each {|i| incrementor += "0"}
(1..100).each {|i| str += incrementor}

Ada saran lain?

Markus Orrelly
sumber
1
Cara terbaik adalah dengan menggunakan JRuby dan StringBuffer. Oooooh.
Jonathan Feinberg

Jawaban:

311
str = "0" * 999999
FMc
sumber
22
Memang, sangat aneh, lihat betapa berbeda dan elegannya penampilan dengan Python str = "0" * 999999
:;
1
Mengapa urutan penting dengan Ruby? Ketika saya melakukannya, 99999 * "0"saya mendapatkanTypeError: String can't be coerced into Fixnum
Steven
16
@Steven Dari perspektif Ruby, "0" * 999999diperlakukan sebagai "0".*(999999)mana *adalah metode dalam Stringkelas. Metode itu menerima angka sebagai argumen yang valid untuk melakukan replikasi string. Saat Anda membalikkan ekspresi, kami mengerti 999999.*("0"). Sekarang kita berbicara tentang *metode di FixNumkelas, dan metode itu menolak untuk mengambil string sebagai argumen. Itu pasti bisa (misalnya, secara otomatis melakukan upaya terbaik untuk mengubah argumen menjadi FixNum) tetapi perancang bahasa memutuskan untuk tidak terlalu sepenuhnya merangkul inspirasi Ruby Perlish.
FMc
11

Opsi lain yang relatif cepat adalah

str = '%0999999d' % 0

Meskipun melakukan benchmarking

require 'benchmark'
Benchmark.bm(9)  do |x|
  x.report('format  :') { '%099999999d' % 0 }
  x.report('multiply:') { '0' * 99999999 }
end

Menunjukkan bahwa perkalian masih lebih cepat

               user     system      total        real
format  :  0.300000   0.080000   0.380000 (  0.405345)
multiply:  0.080000   0.080000   0.160000 (  0.172504)
rampion
sumber
Saya suka jawaban ini, tapi sepertinya saya tidak bisa membuatnya berfungsi untuk apa pun selain '0'. Apa yang harus saya lakukan jika saya ingin 100 r?
pengembang Anda
2
Ini tidak akan berfungsi dengan simbol lain karena memanfaatkan padding angka dalam string format. Angka dapat diisi dengan 0 di depan atau belakang (untuk desimal) tanpa mengubah nilainya, r tidak berfungsi seperti itu.
Andrew