何時認爲使用Ruby的StringIO而不是僅使用String?與Ruby相比,在String中使用StringIO有什麼優勢?
我想我理解它們之間的基本區別,如「What is ruby's StringIO class really?」所突出顯示的那樣,StringIO支持以面向流的方式讀寫字符串。但是這實際上意味着什麼?
簡單地使用String時,使用StringIO的實際用法的一個很好的例子是不是真的會削減它?
何時認爲使用Ruby的StringIO而不是僅使用String?與Ruby相比,在String中使用StringIO有什麼優勢?
我想我理解它們之間的基本區別,如「What is ruby's StringIO class really?」所突出顯示的那樣,StringIO支持以面向流的方式讀寫字符串。但是這實際上意味着什麼?
簡單地使用String時,使用StringIO的實際用法的一個很好的例子是不是真的會削減它?
基本上,它使字符串看起來像一個IO對象,因此名稱爲StringIO。
StringIO類有read
和write
方法,所以它可以傳遞給您的代碼的部分,旨在讀取和寫入文件或套接字。如果你有一個字符串,並且爲了測試你的文件代碼,你希望它看起來像一個文件,這很好。
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
我真的很喜歡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
方法訪問的實際字符串。
我通常使用'Array#<<'然後'數組#加入'這種東西,雖然使用'StringIO'是一種很棒的技術。 – jc00ke
@ jc00ke我的確如此。現在我對Ruby更熟悉了,但是我的習慣導致代碼傾向於**讀者** ......爲了說清楚我的意思,請考慮以下內容:對於編碼器,使用像您所描述的「Array」對於*寫入*當然,但是當*讀取*代碼時,類名'StringIO'是一個** far **更好的目的指示符。更不用說'Array'是一個根本不同的數據結構。而且,使用'Array#join'的必要性會導致額外的代碼「包袱」,而且更復雜!例如,它的參數默認設置爲全局,可能會發生變化。 –
有趣。使用StringIO而不是String有什麼優勢(關於內存使用)? –
可能不是。如果你看看源代碼,看起來它只是在內部保留對String對象的引用,所以它會比普通字符串使用更多的內存:https://github.com/ruby/ruby/blob/trunk/ext /stringio/stringio.c –
儘管如果使用StringIO,沒有內存優勢,但如果爲IO對象設計函數,則可以執行諸如從文件讀取等操作,或者一起操作管道操作。因此,如果使用適當的類,使用IO對象的函數可以使用較少的內存。因此,這可以讓您以相同的方式對字符串或可能更高效的IO對象進行操作。 –