문제

나는 최근에 읽기 좋 게시 사용하기에 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top