2012-09-25 2 views
36

String을 사용하는 것과는 반대로 Ruby의 StringIO를 사용하는 것이 적절한 경우는 언제입니까?String과는 반대로 Rubio에서 StringIO를 사용하면 어떤 이점이 있습니까?

"What is ruby's StringIO class really?"으로 강조 표시된 이들 간의 근본적인 차이점을 이해하고 있다고 생각합니다. StringIO를 사용하면 스트림 지향 방식으로 String을 읽고 쓸 수 있습니다. 그러나 이것은 실질적으로 무엇을 의미합니까?

단순히 String을 사용하여 실제로 잘라내 지 않을 때 StringIO를 사용하는 실제적인 사용 예는 무엇입니까?

답변

59

기본적으로 문자열은 IO 객체처럼 보이므로 StringIO 이름이됩니다.

StringIO 클래스는 readwrite 방법이있다, 그래서 읽기 및 파일이나 소켓에서 쓸 수 있도록 설계되었다 코드의 부분에 전달 될 수 있습니다. 문자열이 있고 파일 코드를 테스트 할 목적으로 파일처럼 보이기를 원할 때 좋습니다.

def foo_writer(file) 
    file.write "foo" 
end 

def test_foo_writer 
    s = StringIO.new 
    foo_writer(s) 
    raise "fail" unless s.string == "foo" 
end 
+3

흥미 롭습니다. String과 반대로 StringIO를 사용할 때 (메모리 사용과 관련하여) 어떤 이점이 있습니까? –

+3

아마도 그렇지 않습니다. 소스 코드를 살펴보면 String 객체에 대한 참조를 내부적으로 유지하는 것처럼 보이므로 일반적인 문자열보다 약간 더 많은 메모리가 사용됩니다. https://github.com/ruby/ruby/blob/trunk/ext /stringio/stringio.c –

+2

'StringIO'를 사용한다면 메모리가 없지만, IO 객체를위한 함수를 설계한다면 파일로부터 읽는 것과 같은 일을 할 수 있고 그렇지 않으면 연산을 파이프 할 수 있습니다. 따라서 IO 객체를 사용하는 함수는 적절한 클래스와 함께 사용되는 경우 메모리를 적게 사용할 수 있습니다. 따라서 이것은 동일한 방식으로 String 또는 아마도 더 효율적인 IO 객체에서 작업 할 수있게합니다. –

23

정말 또 다시 "\n"를 사용하지 않고도 텍스트 한 줄 한 줄을 추가의 유스 케이스에 대한 StringIO있다. 대신이의 예를 들면 다음과 같습니다

s = '' 
s << "\n" << "some text on a new line" 
s << "\nthis is pretty awkward" 
s = "#{s}\neven more ugly!" 

내가 훨씬 깨끗 어떤이

s = StringIO.open do |s| 
    s.puts 'adding newlines with puts is easy...' 
    s.puts 'and simple' 
    s.string 
end 

을 할 수 있습니다. String.IO의 블록 형식을 사용할 필요는 없으므로 다음과 같이 객체를 만들 수 있습니다. s = StringIO.newStringIO#string 메서드를 통해 실제 문자열에 액세스한다는 점을 유념하십시오.

+1

보통'Array # << '를 사용하고 나서' Array # join '은 이런 종류의 일을하지만,'StringIO '를 사용하는 것은 훌륭한 기술입니다. – jc00ke

+2

@ jc00ke 그래서 나는 실제로 그렇게했다. 이제 Ruby에 익숙해 졌으므로 습관으로 인해 ** 독자를 선호하는 코드가 생깁니다 ** 내가 말한 것을 illsutrate하려면 다음을 고려하십시오. 코더에 대해 설명하는 것처럼 'Array'를 사용하면 편리합니다. * write * in, 확실히, 그러나 * reading * 코드 일 때, 클래스 이름'StringIO'은 ** 목적 **의 더 나은 ** 표시기입니다. 'Array'는 근본적으로 다른 데이터 구조입니다. 또한,'Array # join '을 사용하는 것은 과도한 코드 인'수화물 '을 초래하고, 더 복잡하고 복잡합니다! 예를 들어, 인수는 기본적으로 변경 될 수있는 전역으로 설정됩니다. –

관련 문제