在Ruby中使用StringIO而不是String有什么好处?

Sco*_*eph 45 ruby string stringio

何时使用Ruby的StringIO而不是仅仅使用String?

我想我明白他们之间的根本区别的是突出了" 什么是Ruby的StringIO类,是真的吗? ",这StringIO的使人们能够读取和/写入到一个面向流的方式的字符串.但这实际意味着什么呢?

简单地使用String时使用StringIO实际使用的一个很好的例子是不是真的会削减它?

Dav*_*son 69

基本上,它使字符串看起来像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
Run Code Online (Sandbox Code Playgroud)

  • 有趣.使用StringIO而不是String时,是否有任何优势(关于内存使用)? (3认同)
  • 可能不是.如果查看源代码,它看起来只是在内部保留对String对象的引用,因此它将使用比普通字符串稍多的内存:https://github.com/ruby/ruby/blob/trunk/ext /stringio/stringio.c (3认同)
  • 如果你使用`StringIO`没有内存优势,如果你为IO对象设计你的函数,你可以做一些事情,比如从文件中读取,以及管道操作在一起.因此,如果一个IO对象与适当的类一起使用,它可以使用更少的内存.因此,这使您可以以相同的方式操作String或可能更高效的IO对象. (2认同)

Ste*_*ner 27

我非常喜欢StringIO,用于逐行添加文本的用例,而不必"\n"反复使用.例如,而不是这样:

s = ''
s << "\n" << "some text on a new line"
s << "\nthis is pretty awkward"
s = "#{s}\neven more ugly!"
Run Code Online (Sandbox Code Playgroud)

我可以做这个

s = StringIO.open do |s|
  s.puts 'adding newlines with puts is easy...'
  s.puts 'and simple'
  s.string
end
Run Code Online (Sandbox Code Playgroud)

哪个更清洁.没有必要使用块形式String.IO,你可以像这样创建一个对象:s = StringIO.new但无论如何,请务必记住通过该StringIO#string方法访问的实际字符串.

  • @ jc00ke我其实也是.现在我对Ruby更熟悉了,我的习惯导致代码偏向于**读者**...为了阐明我的意思,请考虑以下内容:对于编码人员,使用像你描述的`Array`很方便*写*in,当然,但是当*读*代码时,类名`StringIO`是一个**远**更好的目的指标.更不用说`Array`是一种根本不同的数据结构.此外,使用"Array#join"的必要性导致超额代码"行李",更糟糕的是,复杂性!例如,它的参数默认设置为可以更改的全局. (4认同)