如何在 Ruby 中将 IO 对象转换为字符串?

Posted

技术标签:

【中文标题】如何在 Ruby 中将 IO 对象转换为字符串?【英文标题】:How can I convert an IO object to a string in Ruby? 【发布时间】:2013-02-28 19:34:50 【问题描述】:

我正在使用一个 IO 对象(一些 STDOUT 输出文本),我正在尝试将其转换为字符串,以便我可以进行一些文本处理。我想做这样的事情:

my_io_object = $stdout
#=> #<IO:<STDOUT>>

my_io_object.puts('hi')  #note: I know how to make 'hi' into a string, but this is a simplified example
#=>hi

my_io_object.to_s

我已经尝试了一些事情并得到了一些错误:

my_io_object.read 
#=> IOError: not opened for reading

my_io_object.open
#=> NoMethodError: private method `open' called for #<IO:<STDOUT>>

IO.read(my_io_object)
#=> TypeError: can't convert IO into String

我已通读 IO 类方法,但不知道如何操作该对象中的数据。有什么建议吗?

【问题讨论】:

"IOError: not opens for reading" 应该是一个合适的线索。尝试搜索所述错误。 您还没有清楚地说明您要做什么。解释你想做什么,我们可能会给你一个更好的方法来实现它。你是如何得到你的 STDOUT 文本的? 谢谢,@theTinMan。为缺乏明确性道歉 - 这反映了我的困惑。我最终通过将 STDOUT 指向 StringIO 对象来解决这个问题。 将 STDOUT 指向 StringIO 通常是做错事的标志。创建一个新问题(因为它是一个不同的主题)并解释您正在尝试做什么,展示您如何使用自己的方式完成它,并要求一种更直接/更清洁的方式来完成它。很多时候,我们在代码的早期就走错了路,从那个地方看不到更好的方法,需要其他人的眼睛才能看到并指出我们出错的地方。 【参考方案1】:

我通过将输出定向到 StringIO 对象而不是 STDOUT 解决了这个问题:

> output = StringIO.new
#<StringIO:0x007fcb28629030>
> output.puts('hi')
nil
> output.string
"hi\n"

【讨论】:

所以答案是,你在 StringIO 对象上调用.string。这个答案有效,但我不明白你最初的解释句子【参考方案2】:

STDOUT 接受字符串,它不提供字符串。你可以写,但不能读。

STDOUT.write("hello") # => hello
STDOUT.read # => IOError: not opened for reading

【讨论】:

嗯。那么我唯一的选择是将输出定向到文件,然后从文件中读取以获取字符串对象吗? 你想做什么? 这是一个非常有趣的问题,因为 STDOUT 通常是一个文件,虽然是一种特殊的文件。这是tee gem 文档。就行为而言,这可能就是您所追求的。 谢谢,@vgoff,tee gem 看起来很有趣。

以上是关于如何在 Ruby 中将 IO 对象转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby 中将字符串或整数转换为二进制?

如何在Ruby中将两个字符串转换为两个数组

如何在Ruby中将数组数组转换为一个字符串[关闭]

在Ruby中将unicode代码点转换为字符串字符

如何在 Ruby 中将十进制值数组转换为 MAC 地址?

在 Ruby 中将整数转换为十六进制字符串