Questo è un modo nice 'n simple per acquisire l'output di 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"]}
Cattura STDOUT, che è il canale predefinito utilizzato dal puts
e print
e che le cose come pp
sulle spalle su, è un po 'più complessa:
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
E che è stata stampata:
Writing to STDOUT...
{"a"=>1, :b=>2, "c"=>["ho", "daddy"]}
Capturing off...
Capturing to buffer...
{"a"=>1, :b=>2, "c"=>["ho", "daddy"]}
Le ultime due righe precedenti sono state memorizzate in captured_stdio
sostituendole per il normale canale $stdout
. Qualunque cosa scritta (cosa sarebbe STDOUT) è stata memorizzata. Lo scambio nel canale originale ha ripristinato la normale stampa e ha impedito che qualsiasi altra cosa venga scritta su captured_stdio
.
fonte
2013-03-08 01:53:11
+1 Buona domanda. –
Possibile duplicato di [Come stampare piuttosto su una variabile invece di STDOUT?] (Http://stackoverflow.com/questions/14127375/how-to-pretty-print-to-a-variable-instead-of-stdout) – akostadinov