将pp(或输出到控制台的任何内容)的结果放入字符串中

时间:2013-03-08 00:39:29

标签: ruby

我们知道

require 'pp'
a=["value1", "value2", "value3"]
pp a

漂亮地将数组打印为控制台的输出。我如何将这个漂亮的输出变成一个字符串(一个包含让事情变得漂亮的新行的字符串等)?

...目的是从方法中返回那个漂亮的字符串。

4 个答案:

答案 0 :(得分:53)

string_value = a.pretty_inspect
当你第一次要求'pp'时,

#pretty_inspect也会出现 - 请参阅:http://ruby-doc.org/stdlib-2.1.0/libdoc/pp/rdoc/Kernel.html#method-i-pretty_inspect

如果您想要输出到irb控制台

的版本
 string_value = a.inspect

并且没有必要的任何要求。

答案 1 :(得分:3)

这是捕捉pp

输出的nice 'n simple方法
require 'pp'

asdf = {'a' => 1, :b => 2, 'c' => %w[ho daddy]}
foo = PP.pp(asdf, '')
puts foo
=> {"a"=>1, :b=>2, "c"=>["ho", "daddy"]}

捕获STDOUT,这是putsprint使用的默认通道,并且pp搭载等内容,有点复杂:

require 'pp'
require 'stringio'

asdf = {'a' => 1, :b => 2, 'c' => %w[ho daddy]}
puts 'Writing to STDOUT...'
pp asdf

# remember the old STDOUT stream...
old_stdout = $stdout

# ...and create a new stream that writes to a string.
captured_stdio = StringIO.new('', 'w')
$stdout = captured_stdio

# This is all captured...
puts 'Capturing to buffer...'
pp asdf

# reset STDOUT
$stdout = old_stdout
puts 'Capturing off...'

# show what we got...
puts captured_stdio.string

打印的内容:

Writing to STDOUT...
{"a"=>1, :b=>2, "c"=>["ho", "daddy"]}
Capturing off...
Capturing to buffer...
{"a"=>1, :b=>2, "c"=>["ho", "daddy"]}

上面的最后两行通过将其替换为正常的captured_stdio频道存储在$stdout中。写入的任何内容(什么是STDOUT)都被存储起来。在原始频道中进行交换可以恢复正常打印,并阻止其他任何内容被写入captured_stdio

答案 2 :(得分:1)

如果要将输出保存为字符串,可以使用stringio

以下是一个例子:

#!/usr/bin/env ruby

require 'stringio'
require 'pp'

def output_to_string
  sio = StringIO.new
  old_stdout, $stdout = $stdout, sio
  yield
  $stdout = old_stdout # restore stdout
  sio.string
end

result = output_to_string do
  puts "hello"
  pp ["value1", "value2", "value3"]
end

puts "result: #{result}"

如果您执行此代码,则会获得:

result: hello
["value1", "value2", "value3"]

答案 3 :(得分:0)

另一种使用stringio而不更改$ stdout的方式:

require 'pp'
require 'stringio'

a=["value1", "value2", "value3"]

sio = StringIO.new
PP.pp( a, sio )

puts sio.string