Ruby'de tekrarlanan uzun bir metin dizesini nasıl oluştururum?


138

Yakutta hızlı bir şekilde uzun bir dize oluşturmanın en iyi yolu nedir? Bu çalışıyor, ancak çok yavaş:

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

Ayrıca, iyi bir uzunlukta bir dize oluşturmanın ve daha sonra istenen uzunluğa kadar mevcut bir dizeye eklemenin çok daha hızlı çalıştığını fark ettim:

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

Başka öneriniz var mı?


1
En iyi yol JRuby kullanmak ve StringBuffer kullanmak olacaktır. Oooooh.
Jonathan Feinberg

Yanıtlar:


307
str = "0" * 999999

22
Gerçekten de, çok garip, bak Python'da ne kadar farklı ve zarif görünüyor str = "0" * 999999:;)
tokland

1
Ruby ile sipariş neden önemlidir? Ne zaman 99999 * "0"alırımTypeError: String can't be coerced into Fixnum
Steven

16
@Steven Ruby'nin bakış açısından, sınıfta bir yöntemin nerede olduğu "0" * 999999kabul edilir . Bu yöntem, sayıları dize çoğaltması gerçekleştirmek için geçerli bağımsız değişkenler olarak kabul eder. İfadeyi ters çevirdiğinizde elde ederiz . Şimdi sınıftaki yöntemden bahsediyoruz ve bu yöntem dizeleri argüman olarak almayı reddediyor. Kesinlikle (örneğin, argümanı otomatik olarak bir FixNum'a dönüştürmek için en iyi çabayı gösterebilir), ancak dil tasarımcıları Ruby'nin Perlish ilhamlarını çok fazla kucaklamaya karar verdiler. "0".*(999999)*String999999.*("0")*FixNum
FMc

11

Başka bir nispeten hızlı seçenek

str = '%0999999d' % 0

Kıyaslama olsa da

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

Çarpmanın hala daha hızlı olduğunu gösterir

               user     system      total        real
format  :  0.300000   0.080000   0.380000 (  0.405345)
multiply:  0.080000   0.080000   0.160000 (  0.172504)

Bu yanıtı seviyorum, ancak '0' dışında bir şey için işe yarayamıyorum. 100 r istersem ne yapmalıyım?
yourdeveloperfriend

2
Biçim dizelerinde sayı dolgusu kullanması nedeniyle diğer sembollerle çalışmaz. Sayılar, değeri değiştirmeden önden veya arkadan 0'larla (ondalıklar için) doldurulabilir, r'ler bu şekilde çalışmaz.
Andrew
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.