2010-01-21 13 views
40

È possibile modificare la larghezza utilizzata da prettyprint (require 'pp') durante la formattazione dell'output? Ad esempio:Formattazione di prettyprint di Ruby

"mooth"=>["booth", "month", "mooch", "morth", "mouth", "mowth", "sooth", "tooth"] 
"morth"=>["forth", 
"mirth", 
"month", 
"mooth", 
"morph", 
"mouth", 
"mowth", 
"north", 
"worth"] 

Il primo array è stampato linea perché si adatta ai prettyprint larghezza della colonna permette (79 caratteri) ... la seconda è ripartita su più righe, in quanto non. Ma non riesco a trovare alcun metodo per modificare la colonna in cui questo comportamento inizia.

pp dipende da PrettyPrint (che ha modi per consentire diverse larghezze per il buffer). C'è un modo per modificare la larghezza della colonna predefinita per pp, senza riscriverlo da zero (accesso diretto a PrettyPrint)?

In alternativa, c'è una gemma simile al rubino che fornisce questa funzionalità?

risposta

50
#!/usr/bin/ruby1.8 

require 'pp' 
mooth = [ 
    "booth", "month", "mooch", "morth", 
    "mouth", "mowth", "sooth", "tooth" 
] 
PP.pp(mooth, $>, 40) 
# => ["booth", 
# => "month", 
# => "mooch", 
# => "morth", 
# => "mouth", 
# => "mowth", 
# => "sooth", 
# => "tooth"] 
PP.pp(mooth, $>, 79) 
# => ["booth", "month", "mooch", "morth", "mouth", "mowth", "sooth", "tooth"] 

Per modificare l'impostazione predefinita con una patch scimmia:

#!/usr/bin/ruby1.8 

require 'pp' 

class PP 
    class << self 
    alias_method :old_pp, :pp 
    def pp(obj, out = $>, width = 40) 
     old_pp(obj, out, width) 
    end 
    end 
end 

mooth = ["booth", "month", "mooch", "morth", "mouth", "mowth", "sooth", "tooth"] 
pp(mooth) 
# => ["booth", 
# => "month", 
# => "mooch", 
# => "morth", 
# => "mouth", 
# => "mowth", 
# => "sooth", 
# => "tooth"] 

Questi metodi funzionano anche in MRI 1.9.3

4

Found "ap" alias "Awesome_Print" utile così da git-repo

Codice utilizzato per testare pp e ap:

require 'pp' 
require 'ap' #requires gem install awesome_print 

data = [false, 42, %w{fourty two}, {:now => Time.now, :class => Time.now.class, :distance => 42e42}] 
puts "Data displayed using pp command" 
pp data 

puts "Data displayed using ap command" 
ap data 

O/P da pp vs ap:

Data displayed using pp command 
[false, 
42, 
["fourty", "two"], 
{:now=>2015-09-29 22:39:13 +0800, :class=>Time, :distance=>4.2e+43}] 

Data displayed using ap command 
[ 
    [0] false, 
    [1] 42, 
    [2] [ 
     [0] "fourty", 
     [1] "two" 
    ], 
    [3] { 
      :now => 2015-09-29 22:39:13 +0800, 
      :class => Time < Object, 
     :distance => 4.2e+43 
    } 
] 

Riferimento:

+0

Questo è interessante informazioni aggiuntive. Non è, comunque, una risposta alla domanda come è stata posta - a proposito, "" quaranta "," due "' dovrebbe essere su una riga, a seconda di ciò che l'OP sta cercando. Inoltre, penso che per chiunque valga la pena di considerare quale usare, vale la pena notare che l'output di 'ap' mostrato qui non può essere riletto da una eval ruby ​​(in particolare a causa degli indici di array visualizzati in quel modo), il modo' l'output in pp potrebbe essere spesso (cambia solo spazi bianchi per tipi di oggetti base, sebbene l'oggetto time mostri chiaramente un'eccezione). Solo spunti di riflessione. – lindes