36

我们知道

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

pretty 将数组作为输出打印到控制台。如何将漂亮的输出转换为字符串(包含使事情变得漂亮的换行符的字符串等)?

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

4

4 回答 4

69
string_value = a.pretty_inspect

#pretty_inspect当您第一次需要“pp”时也会出现 - 请参阅:http ://ruby-doc.org/stdlib-2.1.0/libdoc/pp/rdoc/Kernel.html#method-i-pretty_inspect

如果您想要输出到irb控制台的版本是

 string_value = a.inspect

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

于 2013-03-08T00:47:20.603 回答
3

这是捕获以下输出的一种非常简单pp的方法:

需要'pp'

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

捕获 STDOUT,它是和使用的默认通道,puts以及print诸如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.

于 2013-03-08T01:53:11.167 回答
2

另一种使用 stringio 的方法,无需更改 $stdout:

require 'pp'
require 'stringio'

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

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

puts sio.string
于 2019-04-02T09:19:56.757 回答
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"]
于 2013-03-08T01:51:53.163 回答