¿Cómo vuelco los campos de un objeto a la consola?

265

Cuando estoy ejecutando un script Ruby simple, ¿cuál es la forma más fácil de volcar los campos de un objeto en la consola?

Estoy buscando algo similar a PHP print_r()que también funcione con matrices.

roryf
fuente

Respuestas:

421

Posiblemente:

puts variable.inspect
Christian Lescuyer
fuente
15
Agregar un inspectmétodo a su clase le permite definir cómo se muestran los atributos de la clase, en lugar de confiar en la salida predeterminada. Muchas clases no lo implementan bien, pero puede ser realmente útil al depurar. Ruby recurrirá a to_ssi no puede encontrar un método de inspección.
The Tin Man
44
El enlace actual está roto, vea este ruby-doc.org/core-2.0/Object.html#method-i-inspect
SamFlushing
55
server = TCPServer.new 0 ; puts server.inspect #<TCPServer:fd 9> => nil . no funcionará para la mayoría de los objetos complejos.
ribamar
Como esta es la primera respuesta que se encuentra al buscar un var_dumpequivalente de php en ruby, encontré que ppes muy útil en ese caso, mira aquí - stackoverflow.com/questions/6501506/ruby-inspect-readability/…
Rabin
Tenga en cuenta que p objectes un alias paraputs object.inspect
Jan Klimo
54

Puede encontrar un uso para el methodsmétodo que devuelve una matriz de métodos para un objeto. No es lo mismo print_r, pero sigue siendo útil a veces.

>> "Hello".methods.sort
=> ["%", "*", "+", "<", "<<", "<=", "<=>", "==", "===", "=~", ">", ">=", "[]", "[]=", "__id__", "__send__", "all?", "any?", "between?", "capitalize", "capitalize!", "casecmp", "center", "chomp", "chomp!", "chop", "chop!", "class", "clone", "collect", "concat", "count", "crypt", "delete", "delete!", "detect", "display", "downcase", "downcase!", "dump", "dup", "each", "each_byte", "each_line", "each_with_index", "empty?", "entries", "eql?", "equal?", "extend", "find", "find_all", "freeze", "frozen?", "grep", "gsub", "gsub!", "hash", "hex", "id", "include?", "index", "inject", "insert", "inspect", "instance_eval", "instance_of?", "instance_variable_defined?", "instance_variable_get", "instance_variable_set", "instance_variables", "intern", "is_a?", "is_binary_data?", "is_complex_yaml?", "kind_of?", "length", "ljust", "lstrip", "lstrip!", "map", "match", "max", "member?", "method", "methods", "min", "next", "next!", "nil?", "object_id", "oct", "partition", "private_methods", "protected_methods", "public_methods", "reject", "replace", "respond_to?", "reverse", "reverse!", "rindex", "rjust", "rstrip", "rstrip!", "scan", "select", "send", "singleton_methods", "size", "slice", "slice!", "sort", "sort_by", "split", "squeeze", "squeeze!", "strip", "strip!", "sub", "sub!", "succ", "succ!", "sum", "swapcase", "swapcase!", "taguri", "taguri=", "taint", "tainted?", "to_a", "to_f", "to_i", "to_s", "to_str", "to_sym", "to_yaml", "to_yaml_properties", "to_yaml_style", "tr", "tr!", "tr_s", "tr_s!", "type", "unpack", "untaint", "upcase", "upcase!", "upto", "zip"]
dylanfm
fuente
9
Usar la introspección es parte de la diversión de Ruby. A menudo es útil restar un Objeto instance_methodsde la clase 'en cuestión para obtener los métodos que son únicos:(String.instance_methods - Object.instance_methods).sort
el Hombre de hojalata
2
Esta debería ser la respuesta correcta, ya que esperaba esto al encontrar esta página.
jaycode
.methods.sortes muy útil. ¿Hay alguna forma 'inteligente' de mostrar rápidamente métodos que sean (vagamente) únicos para ese objeto en particular? Por ejemplo, un método como .to_spuede aparecer a menudo, por lo que no es tan útil, pero algunos podrían ser muy útiles para conocer ciertos métodos para ciertos objetos. Especialmente en casos que no son obvios. ¿Hay alguna forma de obtenerlos rápidamente? (en este caso, tengo un PG::Resultobjeto y quiero evaluar rápidamente los métodos probables que podría encontrar útiles.
stevec
51

El to_yamlmétodo parece ser útil a veces:

$foo = {:name => "Clem", :age => 43}

puts $foo.to_yaml

devoluciones

--- 
:age: 43
:name: Clem

(¿Depende de que YAMLse esté cargando algún módulo? ¿O estaría normalmente disponible?)

mjs
fuente
3
Sí, to_yamlrequiere que se cargue el modelo YAML. Sin embargo, es parte de la biblioteca estándar de Ruby.
Chuck el
Esto fue útil cuando intentaba inspeccionar un objeto de Amazon S3 en una consola de la aplicación Rails.
Paul
32
p object

Ruby doc p.

p(*args) public

Para cada objeto, escribe directamente obj.inspect seguido de una nueva línea en la salida estándar del programa.

rampion
fuente
¿No es lo mismo que variable.to_s? Descubrí que solo imprime una referencia de objeto a menos que la clase lo anule explícitamente
roryf
15

Si está buscando solo las variables de instancia en el objeto, esto podría ser útil:

obj.instance_variables.map do |var|
  puts [var, obj.instance_variable_get(var)].join(":")
end

o como una sola línea para copiar y pegar:

obj.instance_variables.map{|var| puts [var, obj.instance_variable_get(var)].join(":")}
Miguel
fuente
10

pone foo.to_json

puede ser útil ya que el módulo json se carga por defecto

tjerk
fuente
44
to_jsonno se carga por defecto en 1.8.7 o 1.9.2.
The Tin Man
5

Si desea imprimir un JSON ya sangrado :

require 'json'
...
puts JSON.pretty_generate(JSON.parse(object.to_json))
RUMANIA_ingeniero
fuente
5

Encontré este hilo porque estaba buscando algo similar. Me gustan las respuestas y me dieron algunas ideas, así que probé el método .to_hash y también funcionó muy bien para el caso de uso. soo:

object.to_hash

Gregor
fuente
2
object.attribute_names

# => ["id", "name", "email", "created_at", "updated_at", "password_digest", "remember_token", "admin", "marketing_permissions", "terms_and_conditions", "disable", "black_list", "zero_cost", "password_reset_token", "password_reset_sent_at"]


object.attributes.values

# => [1, "tom", "[email protected]", Tue, 02 Jun 2015 00:16:03 UTC +00:00, Tue, 02 Jun 2015 00:22:35 UTC +00:00, "$2a$10$gUTr3lpHzXvCDhVvizo8Gu/MxiTrazOWmOQqJXMW8gFLvwDftF9Lm", "2dd1829c9fb3af2a36a970acda0efe5c1d471199", true, nil, nil, nil, nil, nil, nil, nil] 
Conor
fuente
44
undefined method 'attributes' for ...
yegor256
3
object.attributes_nameno funcionó, pero lo object.attributeshace para obtener un buen hash de claves y valores. Esto me ayudó, gracias!
d3vkit