最近我读了一篇很好的文章,介绍了在Ruby中使用StringIO
。但作者没有提到的是,StringIO
只是一个"I",没有"O"。例如,你无法这样做:
s = StringIO.new
s << 'foo'
s << 'bar'
s.to_s
# => should be "foo\nbar"
# => really is ''`
Ruby确实需要一个类似Java的StringBuffer。StringBuffer有两个重要用途,第一,它可以像Ruby的StringIO那样测试输出一半。第二,它们有助于从小部分组建长字符串——这是Joel多次提醒我们否则非常慢的事情。
有没有好的替代品?
确实,Ruby中的字符串是可变的,但这并不意味着我们应该总是依赖这种功能。如果stuff
很大,例如这样做的性能和内存需求真的很糟糕。
result = stuff.map(&:to_s).join(' ')
在Java中做这件事的“正确”方法是:
result = StringBuffer.new("")
for(String s : stuff) {
result.append(s);
}
虽然我的Java有点生疏。
stuff.inject('') { |res, s| res << s.to_s }
。你可以放心地依赖于Ruby字符串是可变的,它不会改变,因为这会破坏每一个现有的Ruby应用程序。 - TheoString.new
或+''
。 - Franklin Yu