We know
require 'pp'
a=["value1", "value2", "value3"]
pp a
pretty prints the array as an output to the console. How do I get that pretty output into a string (a string containing the newlines that makes things pretty, etc.)?
...purpose being to return that pretty string from a method.
string_value = a.pretty_inspect
#pretty_inspect
also comes along when you first require 'pp' - See: http://ruby-doc.org/stdlib-2.1.0/libdoc/pp/rdoc/Kernel.html#method-i-pretty_inspect
If you want the version that is outputted to the irb
console that is
string_value = a.inspect
and doesn't have any requires necessary.
This is a nice 'n simple way to capture the output of 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"]}
Capturing STDOUT, which is the default channel used by puts
and print
and that things like pp
piggyback on, is a bit more complex:
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
And what was printed:
Writing to STDOUT...
{"a"=>1, :b=>2, "c"=>["ho", "daddy"]}
Capturing off...
Capturing to buffer...
{"a"=>1, :b=>2, "c"=>["ho", "daddy"]}
The last two lines above were stored in captured_stdio
by substituting that for the normal $stdout
channel. Anything written to (what would be STDOUT) got stored. Swapping back in the original channel restored normal printing, and stopped anything else from being written to captured_stdio
.
Another way to use stringio, without changing $stdout:
require 'pp'
require 'stringio'
a=["value1", "value2", "value3"]
sio = StringIO.new
PP.pp( a, sio )
puts sio.string
If you want to save the output into a string, you can use stringio
Here is an example:
#!/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}"
If you exec this code you get:
result: hello
["value1", "value2", "value3"]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With