我们知道
require 'pp'
a=["value1", "value2", "value3"]
pp a
漂亮地将数组打印为控制台的输出。我如何将这个漂亮的输出变成一个字符串(一个包含让事情变得漂亮的新行的字符串等)?
...目的是从方法中返回那个漂亮的字符串。
答案 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
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,这是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
。
答案 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