Rubyでは、繰り返しテキストの長い文字列をどのように生成しますか?


138

ルビーで長い文字列をすばやく生成する最良の方法は何ですか?これは機能しますが、非常に遅いです:

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

まともな長さの文字列を作成し、それを既存の文字列に必要な長さまで追加すると、はるかに速く機能することにも気付きました。

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

他の提案はありますか?


1
最良の方法は、JRubyを使用してStringBufferを使用することです。うーん。
ジョナサンファインバーグ、2010

回答:


307
str = "0" * 999999

22
確かに、非常に奇妙な、Pythonでどのように違ってエレガントに見えるかを見てくださいstr = "0" * 999999;)
tokland

1
Rubyで順序が重要なのはなぜですか?私はとき99999 * "0"私が得るTypeError: String can't be coerced into Fixnum
スティーブン・

16
@Steven Rubyの観点から"0" * 999999は、クラス内のメソッドの"0".*(999999)場所として扱われます。このメソッドは、文字列複製を実行するための有効な引数として数値を受け入れます。式を逆にすると、が得られます。今、私たちはクラスのメソッドについて話している、そしてそのメソッドは引数として文字列を取ることを拒否する。それは確かに可能です(たとえば、引数をFixNumに変換するために自動的に最善を尽くします)が、言語設計者は、RubyのPerlishのインスピレーションを完全に受け入れることに反対しました。*String999999.*("0")*FixNum
FMc 2017年

11

別の比較的迅速なオプションは

str = '%0999999d' % 0

ベンチマークが

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

乗算がさらに速いことを示しています

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

私はこの答えが好きですが、「0」以外には機能しないようです。100 rが必要な場合はどうすればよいですか?
yourdeveloperfriend 2014年

2
フォーマット文字列の数字のパディングを利用しているため、他のシンボルでは機能しません。数値は、値を変更せずに、前または後ろ(10進数の場合)に0を埋め込むことができます。rはそのように機能しません。
Andrew
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.