2010-01-21 4 views
40

Est-il possible de modifier la largeur que prettyprint (require 'pp') utilise lors du formatage de la sortie? Par exemple:Formatage du joli dessin de Ruby

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

La première rangée est imprimée en ligne car il correspond à l'intérieur de la largeur de la colonne permet prettyprint (79 caractères) ... le deuxième est divisé sur plusieurs lignes, car il ne fait pas. Mais je ne trouve aucune méthode pour changer la colonne sur laquelle ce comportement commence.

pp dépend de PrettyPrint (qui a des moyens d'autoriser des largeurs différentes pour le tampon). Est-il possible de modifier la largeur de colonne par défaut pour pp, sans le réécrire à partir de zéro (accéder directement PrettyPrint)?

Alternativement, existe-t-il une gemme ruby ​​similaire qui offre cette fonctionnalité?

Répondre

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"] 

Pour changer la valeur par défaut avec un patch de singe:

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

Ces méthodes fonctionnent également en IRM 1.9.3

4

Found "ap" alias "Awesome_Print" utile aussi bien de git-repo

Code utilisé pour tester pp et 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 de p 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 
    } 
] 

Référence:

+0

Cette information supplémentaire intéressante. Ce n'est pas, cependant, vraiment une réponse à la question posée - à savoir, «quarante», «deux» 'devrait être sur une ligne, selon ce que le PO cherche. Aussi, je pense que pour quelqu'un qui mérite d'être considéré, il est intéressant de noter que la sortie 'ap' montrée ici ne peut pas être relue par un eva ruby ​​(en particulier parce que les indices du tableau sont affichés de cette façon)' La sortie de pp' pourrait être fréquente (elle ne change que les espaces pour les types d'objets de base - bien que l'objet temps montre clairement une exception à cela). Juste de la nourriture pour la pensée. – lindes