2013-03-13 86 views
13

我正在使用一个IO对象(一些STDOUT输出文本),我试图将它转换为字符串,以便我可以做一些文本处理。我愿做这样的事情:如何将IO对象转换为Ruby中的字符串?

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类的方法读,我做不到弄清楚如何处理该对象中的数据。有什么建议么?

+0

“IO错误:没有打开阅读”应该是一个适当的线索。尝试搜索所述错误。 – 2013-03-13 01:55:11

+0

你没有清楚地说出你想要做什么。解释你想要做什么,我们可以给你一个更好的方法来达到目的。你如何获得标准输出文本? – 2013-03-13 05:27:13

+0

谢谢,@theTinMan。对不清楚的道歉 - 这是我的困惑的反映。我最终通过将STDOUT指向一个StringIO对象来解决这个问题。 – MothOnMars 2013-03-13 22:59:37

回答

21

我解决了这个由我的输出定向到StringIO的对象,而不是STDOUT:

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

STDOUT接受字符串,它不提供字符串。您可以写信给它,但无法读取它。

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

嗯。那么,我唯一的选择是将输出定向到文件,然后从文件中读取以获取字符串对象? – MothOnMars 2013-03-13 02:03:42

+0

你想做什么? – 2013-03-13 02:39:27

+1

这是一个非常有趣的问题,因为STDOUT通常是一个文件,虽然是一种特殊类型的文件。这里是[tee gem](http://rubydoc.info/gems/tee/1.0.0/frames)文档。就行为而言,这可能就是你所追求的。 – vgoff 2013-03-13 02:44:13