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

25

我正在处理一个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 opened for reading" 应该是一个适当的提示。尝试搜索此错误。 - user166390
你没有清楚地说明你想做什么。请解释一下你想要做什么,我们可能可以给你更好的方法来实现它。你是如何获取你的标准输出文本的? - the Tin Man
感谢@theTinMan。抱歉表述不够清晰,这反映了我的困惑。我最终通过将STDOUT重定向到StringIO对象来解决这个问题。 - MothOnMars
将STDOUT定向到StringIO通常是做错事的迹象。创建一个新问题(因为这是一个不同的主题),解释你正在尝试做什么,展示你用自己的方法完成了它,并询问一种更直接/更清洁的方式来完成它。我们经常在代码早期走上错误的道路,无法从那个地方看到更好的方法,需要其他人来看并指出我们哪里出错了。 - the Tin Man
2个回答

38

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

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

所以答案是,在StringIO对象上调用.string。这个答案是可行的,但我不理解你最初的解释句子。 - Harry Wood

-1

STDOUT 接受字符串,但不提供字符串。你可以向它写入内容,但无法从中读取。

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

哦,那么我的唯一选择就是将输出定向到文件,然后从文件中读取字符串对象了吗? - MothOnMars
你想要做什么? - Ryan Guthrie
1
这是一个非常有趣的问题,因为STDOUT通常是一个文件,但是它是一种特殊的文件。这里是tee gem文档。就行为而言,这可能是你想要的东西。 - vgoff
谢谢,@vgoff,tee gem 看起来很有趣。 - MothOnMars

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接