什么时候使用Ruby的StringIO而不是仅仅使用String?
我认为我理解它们之间的根本区别,正如“What is ruby's StringIO class really?”所强调的那样,StringIO使人们能够以面向流的方式读取和写入字符串。但这实际上意味着什么?
简单地使用String时,使用StringIO实际使用的一个很好的例子是不是真的会削减它?
答案 0 :(得分:66)
基本上,它使字符串看起来像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
答案 1 :(得分:26)
我非常喜欢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
但是无论如何,请务必记住通过{{1}访问实际的字符串方法。