2010-01-21 8 views
40

¿Es posible cambiar el ancho que usa prettyprint (require 'pp') al formatear la salida? Por ejemplo:Formateo de la bonita copia de Ruby

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

La primera matriz se imprime en línea porque se ajusta dentro de la prettyprint ancho de columna permite (79 caracteres) ... el segundo se divide en varias líneas, ya que no lo hace. Pero no puedo encontrar ningún método para cambiar la columna en la que comienza este comportamiento.

pp depende de PrettyPrint (que tiene formas de permitir diferentes anchos para el búfer). ¿Hay alguna manera de cambiar el ancho de columna predeterminado para pp, sin volver a escribir desde cero (accediendo directamente al PrettyPrint)?

Alternativamente, ¿hay una gema rubí similar que proporcione esta funcionalidad?

Respuesta

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

Para cambiar el valor por defecto con un parche mono:

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

Estos métodos también trabajan en MRI 1.9.3

4

encontrado "AP" aka "Awesome_Print" útil, así de git-repo

Código utilizado para probar pp y 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 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 
    } 
] 

Referencia:

+0

Esto es interesante información adicional. Sin embargo, no es realmente una respuesta a la pregunta, como por ejemplo, "cuarenta", "dos" 'deben estar en una línea, de acuerdo con lo que el OP está buscando. Además, creo que para cualquier persona que valga la pena considerar cuál usar, vale la pena señalar que el resultado 'ap' que se muestra aquí no puede ser readmitido por un ruby ​​eval (específicamente debido a los índices de matriz que se muestran de esa manera), el camino ' La salida de pp' con frecuencia podría ser (solo cambia el espacio en blanco para tipos de objetos básicos, aunque el objeto de hora muestra claramente una excepción). Solo comida para pensar. – lindes