Putting the results of pp (or anything outputted to console) into a string Putting the results of pp (or anything outputted to console) into a string ruby ruby

Putting the results of pp (or anything outputted to console) into a string


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_stdoutputs '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.


If you want to save the output into a string, you can use stringio

Here is an example:

#!/usr/bin/env rubyrequire 'stringio'require 'pp'def output_to_string  sio = StringIO.new  old_stdout, $stdout = $stdout, sio  yield  $stdout = old_stdout # restore stdout  sio.stringendresult = output_to_string do  puts "hello"  pp ["value1", "value2", "value3"]endputs "result: #{result}"

If you exec this code you get:

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