지 않는 이유는 무엇 루비가 StringBuffer 또는 StringIO?
문제
나는 최근에 읽기 좋 게시 사용하기에 StringIO
루비에서.하여 언급하지 않는,하지만, StringIO
는"I"이 없다"O"당신 할 수 없 이,예를 들어:
s = StringIO.new
s << 'foo'
s << 'bar'
s.to_s
# => should be "foo\nbar"
# => really is ''`
루비 정말 필요 StringBuffer 처럼 하나 Java 니다.StringBuffers 두 가지 중요한 목적이 있습니다.첫째,그들은 당신 테스트 출력에 반의 것 루비 StringIO 않습니다.둘째,그들은 유용 건물에 대한 긴 문자열에서 작은 부분이 조엘은 우리를 생각 나게 다시 이상은 그렇지 않으면 매우 매우 느립니다.
은 거기에 좋은 교체?
그것의 진정한 문자열에는 루비은 변하기 쉬운,그러나 의미하지는 않 우리는 항상 의지는 기능이 있습니다.는 경우 stuff
이 대형,성능 및 메모리 요구 사항의,예를 들어,이 정보가 없습니다.
result = stuff.map(&:to_s).join(' ')
"올바른"이에 해당하는 Java:
result = StringBuffer.new("")
for(String s : stuff) {
result.append(s);
}
하지만 내 Java 됩니다.
해결책
나는 보았다 루비에 대한 문서 StringIO
, 며,그것은 다음과 같 당신이 원하는 것은 StringIO#string
, 지 StringIO#to_s
따라서,변경 코드:
s = StringIO.new
s << 'foo'
s << 'bar'
s.string
다른 팁
다음과 같은 다른 IO 형식 개체에 루비,쓰면 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)
그래서 나는 생각한 정답은 해당하는 자바의 StringBuffer
단순히 사용 String#<<
루비에서.
귀하의 예에서 작동하는 루비-나는 그냥 그것을 시도했다.
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 은 확실히 필요한 루비에서 주로하기 때문에,문자열에는 루비은 변하기 쉬운...따라서 너를 구축할 수 있는 문자열을 수정하여 기존 문자열을 구성하는 대신 새로운 문자열과 함께 각 concat.
참고로 사용할 수도 있습니다 특수 문자열을 구문을 구축할 수 있습니다 문자열을 참조하는 다른 변수 문자열 내에서는 아주 읽을 수 있는 문자열이 건설입니다.생각해 보십시오:
first = "Mike"
last = "Stone"
name = "#{first} #{last}"
이러한 문자열을 포함할 수도 있습 표현하지만 변수...와 같은:
str = "The count will be: #{count + 1}"
count = count + 1