ruby - 为什么 Ruby 没有真正的 StringBuffer 或 StringIO?

标签 ruby string io buffer

我最近读了一篇不错的 post关于在 Ruby 中使用 StringIO。不过,作者没有提到的是 StringIO 只是一个“I”。没有“哦”。你不能这样做,例如:

s = StringIO.new
s << 'foo'
s << 'bar'
s.to_s
# => should be "foo\nbar"
# => really is ''`

Ruby 确实需要一个 StringBuffer,就像 Java 那样。 StringBuffers 有两个重要的用途。首先,它们让您测试 Ruby 的 StringIO 所做的一半输出。其次,它们对于从小部分构建长字符串很有用——Joel 一遍又一遍地提醒我们,否则会非常非常慢。

有好的替代品吗?

的确,Ruby 中的字符串是可变的,但这并不意味着我们应该始终依赖该功能。例如,如果 stuff 很大,那么它的性能和内存要求就非常糟糕。

result = stuff.map(&:to_s).join(' ')

在 Java 中执行此操作的“正确”方法是:

result = StringBuffer.new("")
for(String s : stuff) {
  result.append(s);
}

虽然我的 Java 有点生疏。

最佳答案

我查看了 StringIO 的 ruby​​ 文档,看起来您想要的是 StringIO#string ,不是 StringIO#to_s

因此,将您的代码更改为:

s = StringIO.new
s << 'foo'
s << 'bar'
s.string

关于ruby - 为什么 Ruby 没有真正的 StringBuffer 或 StringIO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10323/

相关文章:

ruby - 适用于 Windows 的优秀且免费的 Ruby 编辑器?

ruby - 无法在 Ubuntu 中安装 therubyracer-heroku

ruby-on-rails - 如何使用 Rails 从网站下载图像?

python - 用 Python 交换字符串中每对相邻字符的最简单方法是什么?

python - 条件 If 语句 : If value in row contains string . .. 设置另一列等于字符串

ruby - 从 ruby​​ 中的输入设备读取

ruby - RSpec:模拟、 stub 和验证

c++ - 带空格的 std::cin 输入?

c - 为什么格式化输入输出需要提供变量?

c++ - 某些文件 I/O C++ 库函数的 Delphi 替代品?