2012-09-25 96 views

回答

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

有趣。使用StringIO而不是String有什麼優勢(關於內存使用)? –

+3

可能不是。如果你看看源代碼,看起來它只是在內部保留對String對象的引用,所以它會比普通字符串使用更多的內存:https://github.com/ruby/ruby/blob/trunk/ext /stringio/stringio.c –

+2

儘管如果使用StringIO,沒有內存優勢,但如果爲IO對象設計函數,則可以執行諸如從文件讀取等操作,或者一起操作管道操作。因此,如果使用適當的類,使用IO對象的函數可以使用較少的內存。因此,這可以讓您以相同的方式對字符串或可能更高效的IO對象進行操作。 –

23

我真的很喜歡StringIO的用於追加文本行由行,而不必一遍一遍使用"\n"的用例。例如,而不是這樣的:

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.new但無論如何,請務必牢記通過StringIO#string方法訪問的實際字符串。

+1

我通常使用'Array#<<'然後'數組#加入'這種東西,雖然使用'StringIO'是一種很棒的技術。 – jc00ke

+2

@ jc00ke我的確如此。現在我對Ruby更熟悉了,但是我的習慣導致代碼傾向於**讀者** ......爲了說清楚我的意思,請考慮以下內容:對於編碼器,使用像您所描述的「Array」對於*寫入*當然,但是當*讀取*代碼時,類名'StringIO'是一個** far **更好的目的指示符。更不用說'Array'是一個根本不同的數據結構。而且,使用'Array#join'的必要性會導致額外的代碼「包袱」,而且更復雜!例如,它的參數默認設置爲全局,可能會發生變化。 –

相關問題