が記載されていないのはなぜRubyインStringBufferはStringIO?
質問
私は最近、素敵な ポスト の利用 StringIO
Ruby.どの作者について言及であること StringIO
ただの"I"が"O"で できない これは、例えば:
s = StringIO.new
s << 'foo'
s << 'bar'
s.to_s
# => should be "foo\nbar"
# => really is ''`
RubyスのStringBufferのように、Javaです。StringBuffersとして確立されている重要な意義があります。第一に、彼または試験出力の半分のRubyのStringIOます。第二に、これらビルまでの長い文字列から小さな部品かるジョエルを思い起こさせもできるので非常に速度が遅くなります。
あの交換?
それは、Rubyの文字列は変更可能なものではないからいつもなが可能です。の場合 stuff
が大きいため、性能およびメモリ要件のことは、例えば、非常に悪いです。
result = stuff.map(&:to_s).join(' ')
の"正しい"をすることJavaは:
result = StringBuffer.new("")
for(String s : stuff) {
result.append(s);
}
私Javaは赤.
解決
ご本人の了解のもと、掲載していrubyの文書 StringIO
, 見たいものを好きなようにする StringIO#string
, ない StringIO#to_s
このように変更コード:
s = StringIO.new
s << 'foo'
s << 'bar'
s.string
他のヒント
のようなその他のIO-typeオブジェクトにRubyを書くときにIOについては、文字のポインタ。
>> s = StringIO.new
=> #<StringIO:0x3659d4>
>> s << 'foo'
=> #<StringIO:0x3659d4>
>> s << 'bar'
=> #<StringIO:0x3659d4>
>> s.pos
=> 6
>> s.rewind
=> 0
>> s.read
=> "foobar"
ったベンチマークや最高速のアプローチを使用して String#<<
方法。を使用 StringIO
が少し遅くなります。
s = ""; Benchmark.measure{5000000.times{s << "some string"}}
=> 3.620000 0.100000 3.720000 ( 3.970463)
>> s = StringIO.new; Benchmark.measure{5000000.times{s << "some string"}}
=> 4.730000 0.120000 4.850000 ( 5.329215)
文字列結の String#+
方法が最も遅いアプローチにより多くの桁:
s = ""; Benchmark.measure{10000.times{s = s + "some string"}}
=> 0.700000 0.560000 1.260000 ( 1.420272)
s = ""; Benchmark.measure{10000.times{s << "some string"}}
=> 0.000000 0.000000 0.000000 ( 0.005639)
喜んでいただけて大変嬉しく思い正解は、相当のJavaの StringBuffer
はを使っているだけで String#<<
Ruby.
えお作Rubyったです。
irb(main):001:0> require 'stringio'
=> true
irb(main):002:0> s = StringIO.new
=> #<StringIO:0x2ced9a0>
irb(main):003:0> s << 'foo'
=> #<StringIO:0x2ced9a0>
irb(main):004:0> s << 'bar'
=> #<StringIO:0x2ced9a0>
irb(main):005:0> s.string
=> "foobar"
なんのその理由を使うto_sることで出力のオブジェクトidです。
したという人もいるかもしれなStringBufferしていませんので必要に応じて、Ruby、Rubyの文字列は変更可能...このようにすることで作ることができる最大文字列を変更することにより、既存の文字列の代わりに新しい文字列の各concat.
として注などでもお使いいただけます特殊な文字列の構文がすることで作ることができる文字列を参照その他の変数の文字列になっているので、非常に可読文字列。発生していると考えること
first = "Mike"
last = "Stone"
name = "#{first} #{last}"
これらの文字列を含むこともでき表現だけでなく、変数の...など
str = "The count will be: #{count + 1}"
count = count + 1