如何在 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 对象转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章