2013-03-08 9 views
21

SappiamoMettendo i risultati di PP (o qualcosa in output per consolare) in una stringa

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

deliziose stampe l'array come uscita per la console. Come faccio a ottenere quell'output carino in una stringa (una stringa che contiene le newline che rende le cose belle, ecc.)?

... lo scopo è quello di restituire quella bella stringa da un metodo.

+0

+1 Buona domanda. –

+0

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

risposta

44
a.pretty_inspect 

#pretty_inspect arriva anche lungo prima quando si richiede 'pp' - vedere: http://ruby-doc.org/stdlib-2.1.0/libdoc/pp/rdoc/Kernel.html#method-i-pretty_inspect

Se si desidera la versione che viene emesso alla console irb che è

a.inspect 

e doesn' t hanno bisogno di necessario.

+1

+1. Bello e breve –

+0

Il collegamento alla documentazione è confuso perché dice che è un metodo Kernel. – Martinos

+0

È disponibile perché il modulo Kernel è incluso nella classe Object. – Martinos

1

Se si desidera salvare l'output in una stringa, è possibile utilizzare stringio

Ecco un esempio:

#!/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}" 

Se Exec questo codice si ottiene:

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

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.

Problemi correlati