Ruby: Cómo hacer una estructura de impresión IRB para Arrays y Hashes


Cuando hago un nuevo array/hash en irb, imprime un buen formato para mostrar la estructura, por ejemplo.

["value1", "value2", "value3"]
{"key1" => "value1"}

... pero cuando intento imprimir mis variables usando puts, las consigo colapsadas:

value1
value2
value3
key1
value1

Deduzco que puts no es la orden correcta para lo que quiero, pero ¿qué es? Quiero poder ver mis variables en irb en el primer formato, no en el segundo.

 64
Author: neezer, 2009-04-01

5 answers

Puedes usar el método inspect:

a=["value1", "value2", "value3"]
puts a.inspect

O, mejor aún, usa la librería pp (pretty print):

require 'pp'
a=["value1", "value2", "value3"]
pp a
 109
Author: dmondark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-31 21:12:34

Otra cosa que puede hacer es usar el método y que convierte la entrada en Yaml. Eso produce un resultado bastante bueno...

>> data = { 'dog' => 'Flemeale', 'horse' => 'Gregoire', 'cow' => 'Fleante' }
=> {"cow"=>"Fleante", "horse"=>"Gregoire", "dog"=>"Flemeale"}
>> y data
--- 
cow: Fleante
horse: Gregoire
dog: Flemeale
 51
Author: Ethan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-15 00:57:28

La bonita impresión funciona bien, pero la gema Awesome_Print es aún mejor! Tendrá que require awesome_print pero maneja los hashes anidados y los arrays maravillosamente más los colorea en el Terminal usando 'ap' en lugar de 'p' para poner la salida.

También puedes incluirlo en tu~/.irbrc para tener esto como el método predeterminado para mostrar objetos:

require "awesome_print"
AwesomePrint.irb!
 12
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-23 05:41:59

Inténtalo .inspeccionar

>> a = ["value1", "value2", "value3"]
=> ["value1", "value2", "value3"]
>> a.inspect
=> "[\"value1\", \"value2\", \"value3\"]"
>> a = {"key1" => "value1"}
=> {"key1"=>"value1"}
>> a.inspect
=> "{\"key1\"=>\"value1\"}"

También puedes usar el método p () para imprimirlos:

>> p a
{"key1"=>"value1"}
 4
Author: Gdeglin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-31 21:12:40

Mi herramienta personal de elección para esto es 'Pretty Print' y el método pp

require 'pp' # <- 'Pretty Print' Included in ruby standard library
pp({ :hello => :world, :this => ['is', 'an', 'array'] })
=> {:hello=>:world, :this=>["is", "an", "array"]} 
 3
Author: jacobsimeon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-06 20:14:45