49

什么时候使用 Ruby 的 StringIO 而不是仅仅使用 String 才是合适的?

我想我理解它们之间的根本区别,正如“ What is ruby​​'s StringIO class really? ”所强调的那样,StringIO 使人们能够以面向流的方式读取/写入字符串。但这实际上意味着什么?

当简单地使用 String 并不能真正削减它时,使用 StringIO 的实际用途的一个很好的例子是什么?

4

2 回答 2

73

基本上,它使字符串看起来像一个 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
于 2012-09-25T23:19:41.977 回答
29

我真的很喜欢 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方法访问的。

于 2013-11-12T02:17:35.163 回答